LiveData의 setValue와 postValue 차이
LiveData는 Observer 패턴을 따르며 데이터의 변경이 일어날 때마다 콜백을 받아 원하는 동작을 실행가능
이때 LiveData의 값을 변경하게 해주는 함수가 바로 setValue()와 postValue()
두 함수 다 접근 제한자가 protected로, 외부에서 LiveData의 값을 변경불가 외부에서 값을 변경해주기 위해서는 LiveData를 상속받은 MutableLiveData를 사용
setValue()
Main Thread에서 LiveData의 값을 변경
Main Thread에서 바로 값을 변경해주기 때문에 setValue() 함수를 호출한 뒤 바로 밑에서 getValue() 함수로 값을 읽어오면 변경된 값을 가져올 수 있다.
Main Thread에서 값을 dispatch 하기 때문에 백그라운드에서 setValue()를 호출한다면 오류가 나게 된다.
setValue()가 동작하지 않을 시, 해당 함수가 호출되는 Thread가 Main Thread인지 체크
postValue()
백그라운드에서 LiveData의 값을 변경
백그라운드 Thread에서 동작하다가 LiveData 값을 set 하고 싶을때, Main Thread에 값을 post 하는 방식으로 사용
함수 내부적으로 아래 코드가 실행됨
new Handler(Looper.mainLooper()).post(() -> setValue())
Main Thread에 적용되기 전 postValue()가 여러 번 호출된다면 모든 값이 적용되는 것이 아니라 가장 최신 값이 적용
따라서 postValue()를 호출한 뒤 바로 getValue()로 값을 읽으려고 한다면 변경된 값을 읽어오지 못할 가능성이 높다. Hander()를 통해 메인 쓰레드에 값이 전달되기 전에 getValue()를 호출하기 때문이다.
LiveData의 값을 즉각적으로 변경해야 한다면 postValue()가 아닌 setValue()를 사용해야 한다.
'Android > Reference' 카테고리의 다른 글
Fragment ViewModel 공유 (0) | 2022.02.22 |
---|---|
Navigation, BottomNavigation 클릭시 Fragment 재생성 막기 (0) | 2022.02.17 |
AAC (MVVM + RoomDB + RecyclerView) 실습 (0) | 2022.02.09 |
AAC (Android Architecture Component) (1) | 2022.02.07 |
string.xml 에 %d, %s 사용 / Databinding 에 StringFormat 적용 (0) | 2022.01.20 |