Android Jetpack - LiveData 정리

TPark·2020년 5월 2일
0

안드로이드

목록 보기
3/10
post-custom-banner

LiveData란?

Observer에게 데이터 변경에 대한 알림을 보내는 클래스. 일반 클래스들과 다르게 LiveData는 애플리케이션의 life cycle을 인식한다.

LiveData의 이점

  • UI와 데이터 상태의 일치 보장
    LiveData는 데이터가 변경되면 Observer 객체에 변경을 알리기 때문에, 변경이 발생할때마다 Observer가 UI를 업데이트 할수 있다. 이때, setValue() 혹은, postValue()가 실행되어야 Observer에 알림이 간다.
    예를 들어, 아래의 코드에서 testLiveData.setValue()가 없었다면 탭을 몇번 누르든 Observer는 알림을 받지 않는다.
    // Test code to practice live data
    ArrayList<Integer> testList = new ArrayList<>(); // LiveData안에 들어갈 리스트
    testList.add(1);
    // 데이터의 변경이 가능한 MutableLiveData. LiveData는 abstract class이기 때문에 instantiate이 불가능
    MutableLiveData<List<Integer>> testLiveData = new MutableLiveData<>(); 
    testLiveData.setValue(testList); // observer가 알림을 받음
    testLiveData.observe(this, new Observer<List<Integer>>() {
        @Override
        public void onChanged(List<Integer> integers) {
            System.out.println("from mutable live data observer: " + integers);
        }
    });
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            testLiveData.getValue().set(0, testLiveData.getValue().get(0) + 1);
            testLiveData.setValue(testLiveData.getValue()); // observer에게 알림을 주기 위해 필요함
            System.out.println("from tab: " + testLiveData.getValue());
        }
    });
  • Lifecycle과 결합되어 있다
    해당 스크린의 수명주기와 결합되어 있기 때문에 메모리 누출이 없고, 필요할때만 콜백이 실행된다. 예를 들어 LiveData가 Activity A와 연결되어 있다고 해보자. Activity A가 OnStop, OnPause 등의 상태일때에는 콜백이 실행되지 않고, 다시 시작되었을때 가장 최근의 데이터를 불러온다.
    LiveDataActivity AObserver Update
    setValue(a)activea
    setValue(b)activeb
    setValue(c)paused-
    setValue(d)paused-
    -resumedd

데이터바인딩 + LiveData

데이터바인딩과 LiveData를 함께 사용하면 Observer에서 직접 UI를 변경해줄 필요없이 xml 파일에서 데이터바인딩만 해주면되기 때문에 코드가 훨씬 더 깔끔해진다.

<layout>
  <data>
      <variable name="user" type="User" />
  </data>
.........
  <TextView
         ...
    android:text="@{user.title}">
  </TextView>

</layout>

+ LiveData는 데이터바인딩, RoomDataBase 등의 다른 Android Architecture components들과 함께 사용되었을 때 훨씬 더 좋은 효과를 낼수 있는 것 같다.

post-custom-banner

0개의 댓글