LiveData vs MutableLiveData

안석주·2021년 7월 13일

LiveData와 MutableLiveData의 내부는 어떻게 구현되어 있을까?

먼저 MutableLiveData의 내부 구조를 보자.

MutableLiveData

MutableLiveData는 클래스로 LiveData를 상속받고 있다. 또한 public으로 postValue와 setValue를 구현한 클래스로 LiveData의 postValue, setValue로 값을 전달해준다.


여기서 잠깐, setValue와 postValue의 차이를 알아보자.

setValue

setValue는 메인 쓰레드에서 실행되며 assertMainThread를 통해 MainThread인지 아닌지 판별하고, MainThread가 아닌 경우 IllegalStateException을 던진다. MainThread인 경우 값을 즉시 바꿔준다. 즉 setValue는 MainThread인 경우에서만 값을 변경해줄 수 있다.
다음은 구글 공식 문서에서의 setValue 이다.

마지막 줄에 만약 값을 백그라운드 쓰레드에서 set해야할 경우, postValue를 사용하라고 한다.

postValue


postValue는 값을 즉시 설정하는 것이 아닌, Runnable을 통해 Main Looper를 이용해 값을 보내고, MainThread에서 다시 setValue를 해준다. 이러한 방식의 postValue이기 때문에 이러한 일이 발생하기도 한다. 구글 공식 문서를 보면

a를 postValue를 이용해 보내고, setValue를 이용해 b를 전달해 주면 liveData에는 b가 세팅된 후 a가 세팅되어 결과적으로는 a가 출력이 될 것이다. 또한 섞어서 무분별하게 사용할 시 어떤 값이 출력될 지 개발자도 모르는 상황이 올 수 도 있으니 주의해서 사용해야 한다.


LiveData에서는 왜 setValue, postValue를 못쓸까?

두 방식 모두 동일한데, LiveData에서는 setValue, postValue 모두 protected 접근 제어자로 만들어 하위 클래스에서만 사용할 수 있도록 만들었기 때문이다.
MutableLiveData에서는 이를 public 접근제어자로 Override하여 어디서든 사용할 수 만들어져 있다. 이와 같은 이유로 데이터를 setValue, postValue를 이용해 변경하고 싶을 때는 어디서든 setValue, postValue가 이용 가능한 MutableLiveData를 이용해야 한다.


그렇다면 setValue, postValue를 구현했다는 것은 알았으니, LiveData의 구조를 보자.


LiveData는 추상클래스로 만들어졌다. 또한 LiveData는 mData의 값을 항상 최신값으로 유지해준다. mVersion이라는 변수를 통해 변경된 횟수를 알 수 있고, mlastVersion과 비교하여 최신 데이터인지 아닌지 구분하는데 사용된다. mPendingData에는 초기값 NOT_SET을 넣어준 뒤, postValue시에 mPendingData에 값을 setting해준다. 후에 Runnable에서 mPendingData의 값을 꺼낸 뒤 사용하고, 다시 값을 NOT_SET으로 바꿔준다.

이렇게 LiveData와 MutableLiveData의 차이점, 그리고 내부 구조를 알아봤다.

출처 및 참고

https://wooooooak.github.io/android/2019/06/11/Android_liveData_value/ ,
https://thdev.tech/android/2021/02/01/LiveData-Intro/ ,
https://developer.android.com/reference/androidx/lifecycle/LiveData?hl=ko#postValue(T)

profile
뜻을 알고 코딩하기

0개의 댓글