AAC (Android Architecture Component)
사용 목적
- 복잡한 LifeCycle을 가진 액티비티나 프래그먼트를 좀 더 쉽게 컨트롤 하기 위하여 사용합니다.
- 액티비티, 프래그먼트 잘못 사용 시 Memory Leak이 발생하게 되고 UI에 데이터를 뿌려주는 역할을 더 쉽게 하기 위하여 사용합니다.
- LiveData을 이용해 데이터 변화에 noti를 받아 UI를 쉽게 변화시킬 수 있습니다.
ViewModel 데이터에 관계가 있는 데이터를 저장해두는 역할을 합니다.
AAC LiveData의 setValue() vs postValue()
두 메소드 모두 MutableLiveData의 값을 변경시킬 수 있는 메소드이며 꼭 이 두 메소드로 데이터를 변경해야 데이터 변화를 감지할 수 있다.
setValue()
- 말 그대로 값을 set하는 함수이다. LiveData를 구독하고 있는 옵저버가 있는 상태에서
setValue()
를 통해 값을 변경 시키면 메인 스레드에서 그 값을 즉시 반영한다. 중요한 점은 메인 스레드에서 값을 dispatch시킨다는 점이다.
postValue()
setValue()
와 마찬가지로 값을 set하는 함수이다. 다만 그 과정이 백그라운드에서 진행된다고 보면 된다.(내부적으로
new Handler(Looper.mainLooper()).post(() -> setValue())
이런 코드가 실행된다. 결국 마지막으로 값을 변경하는 스레드는 메인 스레드이긴 하다.)
따라서,
postValue()
를 한 다음 바로 다음 라인에서getValue()
를 호출할 경우 백그라운드에서 돌기 때문에 변경된 값을 받아오지 못할 확률이 크다. 반면에,setValue()
로 값을 변경할 경우 다음 라인에서getValue()
를 호출하여도 변경된 값을 바로 읽어올 수 있다.- 말 그대로 값을 set하는 함수이다. LiveData를 구독하고 있는 옵저버가 있는 상태에서