LiveData(MutableLiveData)에서 setValue()와 postValue()를 사용하는 경우를 종종 헷갈려하는 사람들이 있어서 간단하게 정리해두려 한다. LiveData는 일반적으로 DataBinding, ViewModel과 함께 사용한다. 값을 변경하는 두 방법의 차이점과 자신이 개발하고 있는 구조를 제대로 파악하지 못하면 필요할 때 UI 변경이 제대로 발생하지 않을 수 있다. 복잡하거나 어렵지는 않으니 간단하게 확인해두면 된다.
setValue()
값을 바로 설정한다. 활성화된 observer가 있는 경우 해당 값이 observer로 dispatch된다. 사용에 있어 주의해야 할 점이 있는데 setValue는 반드시 Main Thread(UI Thread)에서 호출해야 한다. background에서 setValue()를 호출하면 에러가 발생한다.
postValue()
postValue를 호출하면 내부적에서 Handler를 통해 main thread에서 setValue를 호출한다. postValue를 연속으로 여러 번 호출할 모두 변경이 발생하지는 않고 가장 최신의 값만 1번 set될 확률이 크다. 하지만 일반적으로 LiveData는 UI View에서 observe하기 위한 목적으로 사용하므로 최신 값대로만 동작하면 문제될 것이 없다. 그리고 아래의 추가 내용처럼 getValue는 개인적으로 지양하는 것이 좋다고 생각하기 때문에 크게 문제될 일은 없다고 생각한다. 하지만 상황의 제약으로 즉각적인 값의 변경이 필요한 경우에는 postValue가 아닌 setValue를 사용해야 함을 알아두자.
추가
개인적으로, LiveData에서 getValue()는 사용하지 않는 방법을 추천한다. setValue와 postValue를 명확히 알고 사용해야 하며 복잡한 로직과 구조를 필요로 하는 경우 값을 읽고 쓰는 시점에 있어서 의도대로 동작하지 않을 수 있기 때문이다. 물론 여기저기에서 하나의 값을 읽고 쓰는 방식의 구조 자체는 당연히 지양해야 하지만 말이다. postValue()만 사용하고 실제 값의 관리는 따로 두어서 하는 방법이 깔끔하다.
공식 문서
공식 문서에서 추가적인 내용들을 보고 싶다면 다음 주소를 확인해보자.
https://developer.android.com/reference/androidx/lifecycle/LiveData
'Android > Android Development' 카테고리의 다른 글
LiveData와 Kotlin의 Flow (956) | 2021.11.14 |
---|---|
DataStore of Android Jetpack (828) | 2021.10.24 |
Android Custom Lint Checks (1427) | 2021.08.22 |
Google I/O '21 (1785) | 2021.06.20 |
Android Shortcuts (안드로이드 앱 숏컷) - 3. 관리하기 (2) | 2020.08.31 |
댓글