[개념] 안드로이드 LiveData (2)

쓰리원·2022년 6월 1일
0

LiveData

목록 보기
2/2
post-thumbnail

View는 LiveData에서 읽기만 할 수 있고, ViewModel 에서 MutableLiveData를 통해 변경할 수 있습니다. 불변과 가변의 차이를 가진 LiveData와 MutableLiveData에 대해 자세히 알아보겠습니다.

1. MutableLiveData

위는 MutableLiveData의 내부 코드 모습입니다. LiveData를 상속받아서 LiveData 내부에서만 사용할 수 있는 postValue와 setValue를 override 함으로써 외부에서 사용할 수 있게하고 그외 LiveData의 생성자를 사용합니다. MutableLiveData는 불변인 LiveData를 상속받아서 postValue와 setValue를 public 키워드로 호출함으로써 가변성을 부여하기 위한 것을 확인할 수 있습니다.

2. LiveData

LiveData는 추상클래스로 만들어 졌습니다. 또한 LiveData는 mData의 값을 항상 최신값으로 유지해줍니다.

mPendingData에는 초기값 NOT_SET을 넣어준 뒤, postValue시에 mPendingData에 값을 setting 해줍니다. 후에 Runnable에서 mPendingData의 값을 꺼낸 뒤 사용하고, 다시 값을 NOT_SET으로 바꿔줍니다.

mVersion이라는 변수를 통해 변경된 횟수를 알 수 있고, mlastVersion과 비교하여 최신 데이터인지 아닌지 구분하는데 사용 됩니다.

LiveData에서 값이 변경하면 호출되는 observe 메서드 입니다. 시작부터 if문에서 매개로 받은 owner의 Lifecycle의 State이 DESTORYED가 되는 상황이면 바로 return 을 하는것을 확인할 수 있습니다. 위 코드에서 lifecycle에 따라 조건문이 걸려있다는 것을 확인 가능합니다.

3. setValue와 postValue

LiveData는 내부적으로 setValue와 postValue가 존재하지만 이를 외부로 공개하지 않고 상속을 받은 MutableLiveData 라는 서브클래스를 만들고 MutableLiveData를 통해 set을 사용할 수 있게 하였습니다.

1. setValue

setValue는 mData라는 멤버변수의 값을 할당합니다. setValue는 메인 쓰레드에서 실행되며 assertMainThread를 통해 MainThread인지 아닌지 판별하고, MainThread가 아닌 경우 IllegalStateException 발생시키는 구문이 있습니다. MainThread인 경우만 값을 바꿔줍니다. 백그라운드 쓰레드에서 set 해야할 경우, postValue를 사용하라고 위에 초록색으로 적혀 있습니다.

메인 쓰레드가 아니라면 throw를 통해 예외 발생시키는 구문을 위와 같이 코드로 확인 할 수 있습니다.

2. postValue

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

postValue는 값을 즉시 설정하는 것이 아닌, Runnable을 통해 Main Looper를 이용해 값을 보내고, MainThread에서 다시 setValue를 해줍니다.

초록색 주석의 내용을 한번 자세히 보자면, a를 postValue를 이용해 보내고, setValue를 이용해 b를 전달해 주면 liveData에는 b가 세팅된 후 a가 세팅되어 결과적으로는 a가 출력 되게 된다는 것 입니다.

그 이유로는 postValue()를 호출한 뒤 바로 getValue()로 값을 읽으려고 한다면 변경된 값을 읽어오지 못할 가능성이 있습니다. Handler()를 통해 메인 쓰레드에 값이 전달되기 전에 getValue()를 호출하기 때문입니다. 그래서 LiveData의 값을 즉각적으로 변경해야 한다면 postValue()가 아닌 setValue()를 사용해야 합니다.

메인 쓰레드에 적용되기 전에 postValue()가 여러 번 호출된다면 모든 값이 적용되는 것이 아니라 가장 최신의 값이 적용됩니다.

4. reference

https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
https://thdev.tech/android/2021/02/01/LiveData-Intro/

profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글