AAC LiveData란?
1. 개요
옵저버 패턴을 베이스로 하고 있으며 activity/fragment와 viewmodel을 연결하였을 때 관찰이 시작되며, view가 destroy이 되면 viewmodel이 onCleared을 호출하며 관찰 또한 중지된다.
UI와 데이터 상태의 일치 보장
- LiveData는 관찰자 패턴을 따릅니다. LiveData는 수명 주기 상태가 변경되면 Observer 개체에 변경을 알립니다. 코드를 통합하여 이러한 Observer 개체의 UI를 업데이트할 수 있습니다. 앱 데이터가 변경될 때마다 UI를 업데이트하는 대신, 변경이 발생할 때마다 관찰자가 UI를 업데이트할 수 있습니다.
메모리 누출 없음
- 관찰자는 Lifecycle 개체와 결합해 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됩니다.
중지된 활동으로 인한 비정상 종료 없음
- 활동이 백 스택에 있을 때를 비롯하여 관찰자의 수명 주기가 비활성 상태에 있으면 관찰자는 어떤 LiveData 이벤트도 받지 않습니다.
수명 주기를 더 이상 수동으로 처리할 필요 없음
- UI 구성요소는 관련 데이터를 관찰하기 만 하며 관찰을 중지하거나 재개하지 않습니다. LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리합니다.
항상 최신 데이터 유지
- 수명 주기가 비활성화되었다면 다시 활성화될 때 최신 데이터를 받습니다. 예를 들어 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받습니다.
적절한 구성 변경
- 기기 회전과 같은 구성 변경으로 인해 액티비티 또는 프래그먼트가 다시 생성되면, 사용 가능한 최신 데이터를 즉시 받게 됩니다.
리소스 공유
- 싱글톤 패턴을 사용하는 Livedata 개체를 확장하여 시스템 서비스를 앱에서 공유하도록 래핑할 수 있습니다. Livedata 개체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자는 Livedata 개체를 바로 관찰할 수 있습니다.
2. 생명주기
- onActive() 메서드는 LiveData 개체에 활성 관찰자가 있을 때 호출됩니다. 즉, 이 메서드에서 주가 업데이트 관찰을 시작해야 합니다.
- onInactive() 메서드는 LiveData 개체에 활성 관찰자가 없을 때 호출됩니다.
- setValue(T) 메서드는 LiveData 인스턴스의 값을 업데이트하고 모든 활성 관찰자에 변경사항을 알립니다.
3. 라이브 데이터 변환 (TransFormations)
- map(LiveData
source, Function<X, Y> mapFunction) - 두번째 인자의 값은 Any형태이다.
LiveData userLiveData = ...; LiveData userFullNameLiveData = Transformations.map ( userLiveData, user -> user.firstName + user.lastName);
- switchMap(LiveData
source, Function<X, LiveData > switchMapFunction) - 일대일 동적변환
- 두번째 인자의 값은 항상 LiveData이다.
class UserViewModel extends AndroidViewModel {
MutableLiveData nameQueryLiveData = ...
LiveData> getUsersWithNameLiveData() {
return Transformations.switchMap(
nameQueryLiveData,
name -> myDataSource.getUsersWithNameLiveData(name));
}
void setNameQuery(String name) {
this.nameQueryLiveData.setValue(name);
}
}
setValue(T value)
@MainThread
protected void setValue(T value) {
assertMainThread("setValue");
mVersion++;
mData = value;
dispatchingValue(null);
}
- 활성된 옵저버가 있으면 값이 전달되며 메인 스레드로 작동
postValue(T value)
protected void postValue(T value) {
boolean postTask;
synchronized (mDataLock) {
postTask = mPendingData == NOT_SET;
mPendingData = value;
}
if (!postTask) {
return;
}
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
- 메인 스레드 작업에 테스크 되며 작업이 존재하지 않을 경우 메인스레드로 작업이 넘어간다.
- 테스크 된 작업이 호출하기 전 여러번 호출될 경우 마지막 한번만 작동하게 된다.
Leave a comment