LiveData

LiveData는 생명주기를 알 수 있는 데이터 홀더 클래스입니다. 무슨 뜻이냐면 옵저버가 LifecycleOwner에 추가 될 수 있고, LifecycleOwner가 활성화 되어있을때 래핑된 데이터들의 수정사항에 대한 알림을 받을 수 있음을 뜻합니다. 상태가 STARTED 또는 RESUMED이면 LifecycleOwner는 활성상태 입니다. observeForever에 의해 추가된 observer는 항상 활성화 된 것으로 간주되므로 수정된 내용에 대해 항상 알림을 받을 수 있게 되지만, 이러한 옵저버는 반드시 수동으로 removeObserver를 호출해줘야합니다.
생명주기가 추가 된 옵저버는 해당 생명주기가 DESTROYED로 전환되면 자동으로 제거 됩니다. 이는 LiveData를 안전하게 관찰하고 메모리 누수에 관해 걱정할 필요가 없으며 특히 액티비티나 프레그먼트등을 사용할 때 유용합니다. 또한 객체가 파괴 될 때 즉시 구독취소(Unsuscribed)가 됩니다.
추가적으로 LiveData는 onActive()와 onInactive() 메소드를 가지고 있는데 이 메서드를 활용하여 활성 관찰자 수가 0 과 1 사이에서 변경 될 때 알림을 받습니다. 이로 인해 LiveData는 이 객체를 관찰중인(참조중인) observer가 없을때 무거운 리소스를 해제 할 수 있습니다.
이클래스는 ViewModel의 개별 데이터 필드를 보유하도록 설계되었지만 응용 프로그램의 다른 모듈간에 데이터를 분리 된 방식으로 공유하는 데 사용할 수도 있습니다.
 

LiveData 사용시 장점

  • Data와 UI간 동기화
  • 메모리 누수방지
  • 액티비티가 종료됨으로 인한 크래쉬방지
  • 수동적인 생명주기 관리 필요없음
  • 항상 최신의 데이터
  • UI 컨트롤러들의 상태변경이 쉬움
  • 자원공유

 

MediatorLiveData

LiveData의 서브클래스로  다른 LiveData객체의 상태를 관찰하고 onChanged로 부터 이벤트를 받을 수 있게 된다.
이 클래스는 정확하게 active/inactive 상태를 LiveData 객체 소스에게 전달한다.
예를들면 2개의 LiveData객체가 있고 이걸 liveData1 , liveData2라고 치자.
그리고 우리는 이 두개의 오브젝트를 하나로 합치고 싶다. liveDataMerger라는 이름을 가진 MediatorLiveData오브젝트로
그러면 각각으로 부터 onChanged 콜백을 받을수 있고 세로운 값을 적용할 수도 있다.
 

 LiveData liveData1 = ...;
 LiveData liveData2 = ...;
 MediatorLiveData liveDataMerger = new MediatorLiveData<>();
 liveDataMerger.addSource(liveData1, value -> liveDataMerger.setValue(value));
 liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));

10개의 값들만 liveData1에게 적용한다 치고, 10개의 값 적용후에 liveData1의 콜백수신을 끊도록 한다.
 

liveDataMerger.addSource(liveData1, new Observer() {
      private int count = 1;
      @Override public void onChanged(@Nullable Integer s) {
          count++;
          liveDataMerger.setValue(s);
          if (count > 10) {
              liveDataMerger.removeSource(liveData1);
          }
      }
 });

 
 

MutableLiveData

추상클래스인 LiveData를 상속하여 setValue와 postValue메소드를 노출한 클래스이다.
 

postValue

postValue는 메인스레드에게 주어진 값을 설정한다.

liveData.postValue("a");
liveData.setValue("b");

위와 같은 경우 b가 먼저 적용되고 a가 후에 오버라이드 되어 a로 데이터가 설정된다.
 

setValue

setValue는 활성화된 옵저버들에게 값을 전달하게 된다. 이 메소드는 반드시 메인스레드에서 불려야 하며 백그라운드 스레드에서 값을 설정하고 싶다면 반드시 postValue를 호출하도록하자.
 

카테고리: 미분류

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.