본문 바로가기
개발관련

LiveData에서 setValue() / postValue()의 차이점

by MinChan-Youn 2021. 11. 18.

오늘은 LiveData를 사용하다보면 한번쯤은 생각해보게될 setValue와 postValue에 대해서 알아보겠습니다.

처음에 둘의 차이점은 뭐길래 이렇게 안되고 오류나고 하는것인가 생각해보았었는데요 오늘 내용정리를 통해 한번 더 이해하는 시간을 가져보겠습니다.

 

 

LiveDataAndroid Architecture Components(AAC)에서 제공하는 라이브러리 중 하나

MVVM 패턴을 적용한다면 ViewModel, DataBinding과 함께 많이 사용하는 라이브러리입니다.

 

LiveData는 Observer패턴을 따르며 데이터의 변경이 일어날 때 콜백을 받아 원하는 동작을 수행할 수 있다.

LiveData는 값을 변경하게 해주는 함수가 바로 setValue()와 postValue()

 

LiveData는 외부에서 값을 변경하기 위해서 LiveData를 상속받는 MutableLiveData를 사용

그렇다면 setValue()와 postValue()의 차이점에 대해서 알아보겠습니다.

 

 

 

 

*setValue()

setValue()는 MainThread에서 LiveData의 값을 변경. MainThread에서 바로 값을 변경하기 때문에 setValue후 getValue를 통해서 변경된 값을 바로 가져올 수 있다. 하지만 setValue는 MainThread에서 Dispatch하기 때문에 Background에서 setValue를 호출하게 된다면 오류가 나게된다.

 

내용을 정리하자면 setValue는 MainThread에서 동작하기 때문에 Background에서는 실행하지 말것!

 

 

 

*postValue()

postValue()는 구글 공식문서에는 아래와 같이 나와있습니다.

 

If you need set a value from a background thread, you can use postValue(Object) Posts a task to a main thread to set the given value. If you called this method multiple times before a main thread executed a posted task, only the last value would be dispatched.

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

postValue()는 setValue와 다르게 Background에서 값을 변경한다. Background Thread에서 동작하다가 MainThread에서 값을 post하는 방식으로 사용.

 

다음과 같이 동작하기 때문에 postValue()를 호출한 뒤 바로 getValue로 값을 읽으려고한다면 MainThread에 전달되지 않았다면 값이 변경되지 않은 값을 가져올 가능성이 높습니다.

 

정리하자면 postValue는 Background에서 동작하다가 MainTread에서 값을 post함 Handler를 통하여.

LiveData값을 즉각적으로 변경해야 한다면 postValue가 아닌 setValue를 사용해야한다.

 

 

 

 

 

차이점은 MainThread와 Background 둘중 어디서 값이 변경이 되는것인지에 대한 부분이라고 생가각하면 쉬울 것 같습니다. 둘다 똑같이 값을 변경하는것이긴 하지만 분명히 차이점은 존재한다는 점을 내용을 통해서 정리해 보았습니다.

 

이글을 읽으시는 분들도 엄청깊게 이해까지는 안될 수도 있지만 아! 이정도 차이점은 있구나하고 생각하시면 좋겠습니다.