Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- rxjava hot observable
- jvm이란
- 안드로이드 유닛테스트란
- 스택 자바 코드
- 서비스 쓰레드 차이
- 자바 다형성
- 안드로이드 os 구조
- 플러터 설치 2022
- 2022 플러터 안드로이드 스튜디오
- 큐 자바 코드
- 안드로이드 유닛 테스트 예시
- 멤버변수
- 2022 플러터 설치
- jvm 작동 원리
- Rxjava Observable
- rxjava disposable
- 안드로이드 라이선스 종류
- 안드로이드 유닛 테스트
- android ar 개발
- 스택 큐 차이
- 안드로이드 레트로핏 사용법
- android retrofit login
- 안드로이드 레트로핏 crud
- 안드로이드 라이선스
- 클래스
- 서비스 vs 쓰레드
- ar vr 차이
- ANR이란
- 객체
- rxjava cold observable
Archives
- Today
- Total
나만을 위한 블로그
[Android] LiveData의 postValue() vs setValue() 본문
728x90
반응형
둘 다 LiveData의 값을 바꾸는 메서드지만 정의부터 다르다.
먼저 각 메서드의 원형은 아래와 같다.
- setValue(T value)
- postValue(T value)
https://developer.android.com/reference/androidx/lifecycle/LiveData#setValue(T)
값을 설정한다. active observer가 있으면 값이 해당 관찰자에게 전달된다. 이 메서드는 메인 쓰레드에서 호출해야 한다. 백그라운드 쓰레드에서 값을 설정해야 하는 경우 postValue(Object)를 사용할 수 있다.
https://developer.android.com/reference/androidx/lifecycle/LiveData#postValue(T)
주어진 값을 설정하기 위해 메인 쓰레드에 작업을 게시한다(posts a task). 따라서 메인 쓰레드에서
liveData.postValue("a");
liveData.postValue("b");
값 "b"는 처음에 설정되고 나중에 메인 쓰레드가 "a"로 재정의한다. 메인 쓰레드가 게시된 작업을 실행하기 전에 이 메서드를 여러 번 호출하면 마지막 값만 전달된다.
정리하면 setValue()는 메인 쓰레드에서 값을 변경해주는 메서드지만 postValue()는 쓰레드에서 값을 변경해주는 메서드라고 한다.
그리고 postValue()를 사용할 때는 마지막 값만 전달되기 때문에 postValue() 호출 직후 바로 getValue()로 값을 얻으려고 한다면 변경된 값을 가져오지 못할 수도 있다.
https://leveloper.tistory.com/179
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
반응형
'Android' 카테고리의 다른 글
[Android] Application 클래스란? (0) | 2021.09.18 |
---|---|
[Android] 의존성 주입(Dependency Injection)이란? (0) | 2021.09.18 |
[Android] 리사이클러뷰 스크롤 중 데이터가 변경될 때 현재 위치를 유지하는 방법 (0) | 2021.08.12 |
[Android] Rxjava와 Retrofit 같이 사용하는 법 (0) | 2021.08.04 |
[Android] 레트로핏 사용 시 Expected a string but was BEGIN_OBJECT at line 1 column 2 path $ 에러 해결 (0) | 2021.08.04 |
Comments