관리 메뉴

나만을 위한 블로그

[Android] LiveData의 postValue() vs setValue() 본문

Android

[Android] LiveData의 postValue() vs setValue()

참깨빵위에참깨빵 2021. 9. 10. 00:59
728x90
반응형

둘 다 LiveData의 값을 바꾸는 메서드지만 정의부터 다르다.

먼저 각 메서드의 원형은 아래와 같다.

 

  • setValue(T value)
  • postValue(T value)

 

https://developer.android.com/reference/androidx/lifecycle/LiveData#setValue(T) 

 

LiveData  |  Android Developers

LiveData public abstract class LiveData extends Object java.lang.Object    ↳ androidx.lifecycle.LiveData Known indirect subclasses MediatorLiveData LiveData subclass which may observe other LiveData objects and react on OnChanged events from them.  L

developer.android.com

값을 설정한다. active observer가 있으면 값이 해당 관찰자에게 전달된다. 이 메서드는 메인 쓰레드에서 호출해야 한다. 백그라운드 쓰레드에서 값을 설정해야 하는 경우 postValue(Object)를 사용할 수 있다.

 

https://developer.android.com/reference/androidx/lifecycle/LiveData#postValue(T) 

 

LiveData  |  Android Developers

LiveData public abstract class LiveData extends Object java.lang.Object    ↳ androidx.lifecycle.LiveData Known indirect subclasses MediatorLiveData LiveData subclass which may observe other LiveData objects and react on OnChanged events from them.  L

developer.android.com

주어진 값을 설정하기 위해 메인 쓰레드에 작업을 게시한다(posts a task). 따라서 메인 쓰레드에서

liveData.postValue("a");
liveData.postValue("b");

값 "b"는 처음에 설정되고 나중에 메인 쓰레드가 "a"로 재정의한다. 메인 쓰레드가 게시된 작업을 실행하기 전에 이 메서드를 여러 번 호출하면 마지막 값만 전달된다.

 

정리하면 setValue()는 메인 쓰레드에서 값을 변경해주는 메서드지만 postValue()는 쓰레드에서 값을 변경해주는 메서드라고 한다.

그리고 postValue()를 사용할 때는 마지막 값만 전달되기 때문에 postValue() 호출 직후 바로 getValue()로 값을 얻으려고 한다면 변경된 값을 가져오지 못할 수도 있다.

 

https://leveloper.tistory.com/179

 

[Android] LiveData setValue() vs postValue()

 최근에 프로젝트에서 백그라운드 쓰레드에서 콜백 함수를 호출해 LiveData의 값을 변경해줘야 하는 로직이 있었다. 이때, setValue() 함수를 호출해 값을 변경해줬는데, 값이 변경되지 않는 이슈가

leveloper.tistory.com

postValue()는 setValue()와 다르게 백그라운드에서 값을 변경한다. 백그라운드 쓰레드에서 동작하다가 메인 쓰레드에 값을 post 하는 방식으로 사용된다. 함수 내부적으로는 아래와 같은 코드가 실행된다.

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

메인 쓰레드에 적용되기 전에 postValue()가 여러 번 호출된다면 모든 값이 적용되는 것이 아니라 가장 최신의 값이 적용된다. 따라서 postValue()를 호출한 뒤 바로 getValue()로 값을 읽으려고 한다면 변경된 값을 읽어오지 못할 가능성이 높다. Hander()를 통해 메인 쓰레드에 값이 전달되기 전에 getValue()를 호출하기 때문이다. LiveData의 값을 즉각적으로 변경해야 한다면 postValue()가 아닌 setValue()를 사용해야 한다.

 

위의 내용과 관련해서는 이 글을 읽어보는 것도 좋을 것 같다.

https://blog.mindorks.com/livedata-setvalue-vs-postvalue-in-android

 

LiveData setValue vs postValue in Android

In this blog, we will learn about LiveData and the methods that are used to update the value of the LiveData i.e. setValue() method and postValue() method. We will look at the difference between these two methods. So, let's get started.

blog.mindorks.com

 

반응형
Comments