티스토리 뷰

Android

[Android] LiveData

DDunTory 2021. 3. 14. 23:47

LiveData : A lifecycle aware observable data holder class

 

LiveData의 간단한 소개

이전 글 : dduntorry.tistory.com/entry/Android-LiveData

 

LiveData 소개

LiveData에 대한 안드로이드 공식문서입니다. https://developer.android.com/topic/libraries/architecture/livedata.html LiveData 개요  | Android 개발자  | Android Developers LiveData를 사용하여 수명..

dduntorry.tistory.com

 

안드로이드에는 3가지 앱 구성요소가 있습니다.

 

Activity, Fragment, Service

 

이 3가지 앱 구성요소는 LiveData 객체의 옵저버가 될 수 있습니다.

 

LiveData는 활성화 된 생명주기 상태에서 옵저버만 업데이트 시킬 수 있습니다.

 

Rx를 쓸 때, Activity, Fragment, Service가 활동상태가 아니라면 우린 옵저버를 표출하는데에 조심해야 합니다.

하지만! LiveData를 쓰면 걱정 할 필요가 없습니다!

 

LiveData는 앱 데이터가 변경될 때, 자동적으로 UI를 업데이트 시켜줍니다.

그러므로 LiveData를 쓰면 항상 최신 데이터를 반영하죠.

 

또한, LiveData를 쓰면 생명주기를 수동으로 처리하기 위해 코드를 작성 할 필요가 없습니다.

생명주기가 Destroy 되면 이 생명주기와 연관 된 LiveData는 스스로 사라지게 되니까요.

 

그러므로 Activity, Fragment가 Destroy 되는 결과로 인해 메모리 leak나 crush가 일어날 일이 없답니다.

마지막으로 LiveData를 씀으로써 앱의 서로 다른 구성요소간의 앱 서비스를 공유할 수 있답니다~

 

MutableLiveData : Sub Class of LiveData

LiveData 객체 안에 있는 데이터는 수정이 불가능 하고 읽기만 가능합니다. 즉 데이터를 직접 업데이트 할 수 없죠.

하지만 MutableLiveData는 데이터를 변경 수정할 수 있게 해줍니다.

 

 


 

LiveData 실습

 

이전 ViewModelFactory 블로그 포스팅의 실습 코드로 해보겠습니다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <EditText
            android:id="@+id/input_edit_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:inputType="number"
            android:textSize="36sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.323"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.064" />

        <Button
            android:id="@+id/insert_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="50dp"
            android:layout_marginTop="40dp"
            android:text="Add"
            android:textSize="36sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/input_edit_text" />

        <TextView
            android:id="@+id/result_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="45dp"
            android:layout_marginTop="32dp"
            android:layout_marginEnd="41dp"
            android:textSize="36sp"
            app:layout_constraintEnd_toEndOf="@+id/insert_button"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/insert_button" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

activity_main.xml 의 디자인

 

MainActivityViewModel

class MainActivityViewModel(
    startingTotal : Int
) : ViewModel() {
     private var total = MutableLiveData<Int>()
     val totalData : LiveData<Int>
     get() = total

    init {
        total.value = startingTotal
    }

    fun setTotal(input:Int){
        total.value =(total.value)?.plus(input)
    }
}

 

이 전 ViewModelFactory의 실습 코드를 보면 아래와 같습니다.

class MainActivityViewModel(
    startingTotal: Int
) : ViewModel() {
    private var total=0
    init {
        total = startingTotal
    }

    fun getTotal(): Int {
        return total
    }
    fun setTotal(input: Int) {
        total+=input
    }
}

 

total 변수는 항상 업데이트 되어야 하는 데이터입니다. 따라서 MutableLiveData가 되어야 하죠. 

MutableLiveData 이므로 startingTotal 값을 할당 받을 수 있습니다.

그리고 캡슐화로 total을 totalData: LiveData 로 감싸준 뒤, 코틀린 get 메소드를 써서 getter를 대체합니다.

 

totalData는 LiveData 인데 total을 받을 수 있는 이유는 MutableLiveData가 LiveData의 하위 클래스이기 때문이랍니다~

 

 

MainActivityViewModelFactory

class MainActivityViewModelFactory(private val startingTotal : Int) : ViewModelProvider.Factory{

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(MainActivityViewModel::class.java)){
            return MainActivityViewModel(startingTotal) as T
        }
        throw IllegalArgumentException("Unknown View Model Class")
    }
}

 

ViewModelFactory는 ViewModel이 인자를 가질 때 사용합니다

이전 블로그 포스팅 : dduntorry.tistory.com/entry/Android-ViewModelFactory

 

[Android] ViewModelFactory

ViewModelFactory는 ViewModel을 통해 전달되는 인자가 있을 때 사용됩니다 class MainActivityViewModel( startingTotal: Int ) : ViewModel() { } 위와 같이 전달 인자가 있으면 사용해요 ViewModelFactory 실습..

dduntorry.tistory.com

 

MainActivity

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var viewModel: MainActivityViewModel
    private lateinit var viewModelFactory: MainActivityViewModelFactory
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        viewModelFactory = MainActivityViewModelFactory(125)
        viewModel = ViewModelProvider(this,viewModelFactory).get(MainActivityViewModel::class.java)

        viewModel.totalData.observe(this, Observer {
            binding.resultTextView.text = it.toString()
        })

        binding.insertButton.setOnClickListener {
            viewModel.setTotal(binding.inputEditText.text.toString().toInt())
        }
    }
}

this : MainActivity의 it(Int, 업데이트 되는 데이터)를 옵저빙하며 항상 최신 데이터를 유지합니다.

 

이로써 LiveData 실습을 마치겠습니다

'Android' 카테고리의 다른 글

[Android] ViewModelFactory  (0) 2021.03.07
[Android] ViewModel  (0) 2021.03.06
[Android] DataBinding  (0) 2021.03.02
[Android] MVVM 패턴  (0) 2020.08.11
[Android] LiveData 소개  (0) 2020.08.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함