LiveData 는 관찰 가능한 데이터 홀더 클래스로 안드로이드 수명 주기를 인식한다는 특징을 가지고 있는 클래스다. Observe 패턴을 통해서 데이터가 변경됨에 따라 UI 를 자동으로 업데이트 할 수 있다는 장점이 있다.
이번 글에서는 LiveData 의 데이터를 업데이트 할 수 있는 메서드인 postValue 와 setValue 의 차이에 대해서 설명한다.
setValue
메인 스레드에서 호출해야하며, 호출하자마자 변경된 값을 받아올 수 있다는 특징을 가진다. 아래 예시 코드를 보면 이해가 더 쉽다.
// MainActivity
viewModel._test.value = 1
Log.d("setValue", "onCreate: ${viewModel.test.value}")
viewModel._test.value = 2
Log.d("setValue", "onCreate: ${viewModel.test.value}")
// log
// onCreate: 1
// onCreate: 2
viewModel 에 정의된 MutableLiveData 인 _test 의 값에 setValue (코틀린에서는 value 로 표현됨) 를 호출하여 값을 할당하면 즉각적으로 값이 변경되기 때문에 바로 아래에서 값을 get 할 경우 변경한 값을 받아올 수 있다.
postValue
위의 setValue 와는 다르게 postValue 는 백그라운드에서 호출되어야 하며, 메인 스레드에서 변경할 값을 전달해주는 개념이다. 즉 백그라운드에서 호출하자마자 값이 변경되는 것이 아니라 전달받은 메인 스레드가 post 된 값을 반영해주는 방식이다. 그래서 메인 스레드가 post 된 값을 반영하기 전에 여러번 postValue 를 호출하게 되면 아래 코드와 같이 가장 최신의 값만 읽어올 수 있다.
// viewModel
fun t(){
_test.postValue(1)
_test.postValue(2)
}
// MainActivity
viewModel.t()
viewModel.test.observe(this){
Log.d("postValue", "onCreate: $it")
}
// log
// onCreate: 2
또한 setValue 와는 다르게 post 하고 난 후 바로 값을 받아오려고 하는 경우 최신 데이터가 반영되지 않은 상태일 수 있다. 아래 코드에서는 백그라운드에서 postValue 를 호출하고 난 후에 바로 값을 get 하려는 코드이다. log 값을 보면 postValue 한 값이 반영되지 않아 null 로 나타남을 알 수 있다.
// viewModel
fun t(){
_test.postValue(1)
Log.d("postValue", "t: ${test.value}")
_test.postValue(2)
Log.d("postValue", "t: ${test.value}")
}
// MainActivity
viewModel.t()
// log
// t: null
// t: null
주로 viewModel 과 LiveData 를 사용할 때 postValue 를 사용했었는데, setValue 와 어떤 차이가 있는지 의문이 들어 공부해보았다.
'Android 공부' 카테고리의 다른 글
32. Kotlin Flow 도입하기 (3) | 2023.11.19 |
---|---|
30. Navigation Component (0) | 2023.09.03 |
29. JVM 구조 (0) | 2023.08.11 |
28. 안드로이드 Room Migration (0) | 2023.02.22 |
26. 안드로이드 Bundle & Parcelable (0) | 2023.02.16 |