ViewModel에서 LiveData값을 변경해주는 일이 자주 발생한다. 이때 값을 변경해 줄 때 setValue()와 postValue() 두개가 있고 이것들의 차이점을 알고자 했다.

기본적으로 LiveData는 AAC에서 제공하는 라이브러리중 하나로 DataBinding, ViewModel과 함께 자주 사용한다. 요새는 Flow를 사용하지만 두개의 차이점은 분명하고 장단점도 다르기에 이것에 대해 한번 정리해야겠다.
LiveData는 Observer패턴을 따르며 데이터가 변경이 일어날 때마다 콜백을 받아 원하는 동작을 실행할 수 있다. 내가 말하고자 하는 바는 데이터가 변경될때마다 viewModel의 메서드를 만들고 그 안에서 viewModel내부의 livedata값들을 갱신하는 콜백을 넣을때의 이야기이다.
이때 setValue()와 postValue()두가지 방법이 있는데 이것의 차이점을 알아보자.


setValue( )

메인 쓰레드에서 LiveData값을 변경해준다. 메인 쓰레드에서 바로 값을 변경해주기 때문에 setValue()함수를 호출한 후 바로 밑에서 getValue()함수로 값을 읽어오면 변경된 값을 가져올 수 있다. 즉, 메인쓰레드에서 값을 dispatch하기 때문에 백그라운드에서 호출하나다면 오류가 발생하게 된다.


postValue( )

백그라운드에서 값을 변경한다. 백그라운드 쓰레드에서 동작하다가 메인 쓰레드에 값을 post하는 방식으로 사용되고 디버깅을 돌려 스텝별로 확인하면

Handler(Looper.mainLooper()).post() -> setValue())

다음과 같이 핸들러를 생성해 큐를 던지는것을 볼 수 있다.
만약 postValue( ) 를 사용시 여러 번 호출하여 사용한다면 모든 값이 적용되는것이 아니라 가장 최신의 값이 적용될 것이다.

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글