AAC LiveData란?

1 minute read

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);
    }
  • 메인 스레드 작업에 테스크 되며 작업이 존재하지 않을 경우 메인스레드로 작업이 넘어간다.
  • 테스크 된 작업이 호출하기 전 여러번 호출될 경우 마지막 한번만 작동하게 된다.

Updated:

Leave a comment