프로젝트에서 livedata를 사용하던 중,
mutablelivedata의 setValue()와 postValue() 메소드들 중 하나를 사용하여 값을 넣어줘야 했다.
(Feat. 둘 다 MutableLiveData의 값을 변경시키는 메소드이다.)
왜인지 당연하게도 postValue로 데이터들을 넣어주고 있었다...
이번 기회를 통해 setValue와 postValue에 대해서 정확히 짚고 넘어가야겠다.
SetValue()
- 메인 쓰레드에서 값을 바로 변경한다. (바로 변경되므로, getValue()로 값을 바로 가져올 수 있음)
- 메인쓰레드에서 값을 변경시키므로 Livedata를 관찰하고 있는 Observer는 바로 알아차릴 수 있다.
- 메인쓰레드에서 값을 dispatch하기 때문에 백그라운드에서 호출하면 오류가 발생하게 된다.
PostValue()
- 백그라운드에서 값을 변경한다.
- 백그라운드에서 실행되기 때문에 postValue()를 한 다음, 바로 LiveData의 getValue()를 호출한다면, 변경된 값을 받아오지 못할 가능성이 크다.
- 백그라운드 쓰레드에서 동작하다가 메인 쓰레드에 값을 post하는 방식으로 사용된다.
- (new Handler(Looper.mainLooper()).post(() -> setValue()) 내부적으로 이렇게 돌아간다.
"메인 스레드로 주어진 값을 설정하기 위한 작업을 게시합니다.
따라서 메인 스레드에서 다음과 같은 코드가 실행되면:
liveData.postValue("a");
liveData.setValue("b");
첫 번째로 'b' 값이 설정될 것이고, 이후 메인 스레드는 이 값을 'a'로 덮어쓸 것입니다.
만약 메인 스레드가 게시된 작업을 실행하기 전에 이 메서드를 여러 번 호출했다면, 마지막 값만 전송될 것입니다."
요약하자면, postValue 메서드는 백그라운드에서 작업을 게시한 후, 메인스레드에 값을 post한다.
그러나 setValue는 메인 스레드에서 즉시 값을 설정한다.
따라서 위의 예제에서는 setValue를 통해 "b"를 설정한 후 postValue를 통해 "a"를 나중에 설정하므로,
최종적으로 "a" 값이 LiveData에 설정된다.