LiveData?
LiveData는 관찰 가능한 데이터 홀더 클래스이다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명주기를 인식한다.
이렇게 공식문서에 정의되어있다.
즉, 쉽게 다시 설명하자면 데이터를 LiveCycle과 결합해서 관찰해줄 수 있는 것이 LiveData이다!!
가장 대표적인 장점 중에 하나가 UI와 데이터 상태의 일치를 보장해준다!
LiveData는 기본 데이터가 변경될 때 observer 객체에 알리고, 코드를 통합하여 이러한 observer객체에 UI를 업데이트할 수 있다.
다음 예시를 살펴보자!
class MainActivity : AppCompatActivity() {
private var testMutableLiveData = MutableLiveData(0)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<Button>(R.id.btnArea).setOnClickListener {
testMutableLiveData.value = testMutableLiveData.value!!.plus(1)
}
//데이터가 변할 때 마다 관찰해줄 수 있는 친구
testMutableLiveData.observe(this, Observer {
Log.d("testMutableLiveData", testMutableLiveData.value.toString())
findViewById<TextView>(R.id.textArea).text = testMutableLiveData.value.toString()
})//변경될 때 마다 로그가 찍힘
//
}
}
현재 LiveData가 0이지만 버튼을 클릭할 때 마다 1씩 늘어난다.
이 때 observer를 통해 데이터가 변경될 때 마다 내가 직접 업데이트하는 것이 아닌 자동으로 업데이트해준다.
하지만 이렇게 사용하면 문제점이 있다.
화면이 뒤집어져 Activity의 생명주기가 종료된다면 데이터가 초기화되는 문제가 발생한다.
즉, 액티비티 안에서 LiveData를 사용하면 생명주기에 따라 데이터가 사라질 수 있다!!
따라서 우리는 ViewModel 과 같이 LiveData를 사용할 수 있다.
ViewModel and LiveData
class MainViewModel : ViewModel() {
var testMutableLiveData = MutableLiveData(0)
fun plusLiveDataValue(){
testMutableLiveData.value = testMutableLiveData.value!!.plus(1)
}
}
class MainActivity : AppCompatActivity() {
lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
findViewById<Button>(R.id.btnArea).setOnClickListener {
viewModel.plusLiveDataValue()
}
viewModel.testMutableLiveData.observe(this, Observer {
findViewById<TextView>(R.id.textArea).text = viewModel.testMutableLiveData.value.toString()
})
}
}
액티비티가 아닌 MainViewModel에서 LiveData를 넣어준 다음 액티비티에서 값을 변경해주고, observer를 사용한다면
위의 그림과 같이 앱을 돌려 생명주기에 영향을 준다고 하더라도 값이 보존되는 것을 확인할 수 있다!!
ViewModel과 LiveData의 장점이 이렇게 워낙 강력하다보니 많은 분들이 MVVM패턴을 더 선호하는 것 같다
아직 MVVM패턴에 대해서 익숙하지 않지만 꼭 익혀야만 하는 기술 같다.
'Android > JETPACK' 카테고리의 다른 글
[JETPACK개론] Fragment LiveData / LifeCycleOwner (0) | 2022.08.19 |
---|---|
[JETPACK개론] LiveData 와 MutableLiveData (0) | 2022.08.18 |
[JETPACK개론] ViewModelFactory (0) | 2022.08.16 |
[JETPACK개론] Activity/Fragment 의 ViewModel 공유 (0) | 2022.08.12 |
[JETPACK개론] ViewModel ? (0) | 2022.08.11 |