새소식

android studio

[android] setValue() , postValue()

  • -

 

 

프로젝트에서 livedata를 사용하던 중,

mutablelivedatasetValue()와 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에 설정된다.

'android studio' 카테고리의 다른 글

[Android] Local Database(SQLite, Room)  (0) 2023.09.12
[android] Handler & Looper  (0) 2023.07.24
[android] android service?  (0) 2023.07.21
[android] ViewBinding vs DataBinding ?  (0) 2023.07.12
[android] ViewModel란?  (0) 2023.07.09
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.