-
LiveData 기본 사용법, 내부구현 - [안드로이드 android]안드로이드 2023. 7. 25. 02:25
기본 사용법
import androidx.lifecycle.MutableLiveData class LiveDataTest { // 선언 private val liveDataTest = MutableLiveData<String>() // set on mainThread fun setLiveData() { liveDataTest.value = "testValue" } // mainThread 외의 thread에서 값 세팅 fun setLiveDataOnOtherThread() { liveDataTest.postValue("testValue") } // get fun getLiveDataValue(): String? { return liveDataTest.value } }분석
- LiveData는 abstract class로 구현체인 MutableLiveData로 생성할 수 있다.
- 내부에서 data는 Object로 초기 세팅된다.

- getValue: 내부 변수인 mData를 return하고 초기값인 경우 null을 return 한다.



- setValue:
현재 thread가 mainThread인지 검사한다.
mVersion을 올려 가장 최근 업데이트 버전을 갱신하며 값을 갱신한다.
dispathchingValue 함수를 통해 구독중인 Observer들에게 값 갱신을 알린다.
이때 considerNotify 함수를 호출하여 값 갱신이 필요한 observer에만 알리게 된다.
1. shouldBeActive 함수를 이용하여 STARTED or RESUMED 상태인지 검사
2. observer의 최근 업데이트 버전이 현재 버전보다 낮은지 검사



- postValue:
MainThread가 아닐 때 값을 변경하기 위해 호출한다.
runnable을 통해 값의 세팅을 위임하며, synchronized를 사용하기 때문에 하나의 값이 세팅중이면 나머지 thread의 요청은 대기하게 된다.
만약 같은 스레드가 2개의 postValue 요청을 거의 동시에 보내게 된다면 mPendingData의 값은 마지막에 요청한 값이 되고,
값의 갱신은 가장 처음 요청이 처리하게 된다.
이때, mPendingData의 값은 volatile(cache를 사용하지 않고 메인 메모리에만 값을 저장함)로 선언되어 있기 때문에 원자성이 보장되어 문제가 없다.
'안드로이드' 카테고리의 다른 글