LiveData?
- LiveData?
- 관찰 가능한 데이터 홀더 클래스
- Activity, Fragment, Service 등 다른 앱 구성요소의 수명주기 고려
- LiveData에 LifecycleOwner 인터페이스를 구현하는 객체(ex. Activity, Fragment)와 페어링된 관찰자 등록 가능
- 페어링 된 객체의 수명 주기가 STARTED 또는 RESUMED일 때:
관찰자는 LiveData 변경사항에 관한 알림을 받음- 페어링된 객체의 수명 주기가 DESTROYED로 변경될 때:
관찰자 삭제
LiveData 사용의 이점
- UI와 데이터 상태의 일치 보장
- LiveData 데이터 변경 -> 관찰자 알림 받음 -> 관찰자가 UI 업데이트
- 개발자가 데이터가 변경될 때마다 UI를 업데이트할 필요 X
- 메모리 누수 X
- 관찰자와 페어링된 객체의 수명 주기가 끝나면, 관찰자 바로 삭제
- 중지된 활동으로 인한 비정상 종료 X
- 관찰자와 페어링된 객체의 수명주기가 active하지 않으면, 이벤트를 받지 X
- 수명 주기를 수동으로 처리 X
- 최신 데이터 유지
- 리소스 공유
- 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스 래핑 가능
-> 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있음
LiveData 객체 사용
- (1) 데이터를 보유할 LiveData 인스턴스 생성
- 일반적으로 ViewModel 클래스 내부에 생성
- (2) onChanged() 메서드를 정의하는 Observer 객체 생성
- LiveData가 보유하는 데이터가 변경되었을 때 수행할 작업 제어
- 일반적으로 UI 컨트롤러 내부에 생성
(UI 컨트롤러 ex. Activity, Fragment)- (3) observe() 메서드를 사용하여 LiveData 객체에 Observer 객체 연결
- 객체 관찰 시작에 적합한 장소: UI 컨트롤러의 onCreate()
@MainThread observe(@NonNull LifecycleOwner owner, @NonNull Observer<Object> observer)
- (4) LiveData 객체 업데이트
- MutableLiveData 클래스의 setValue(T) 및 postValue(T) 메서드 사용
-> Observer 이벤트 트리거
-> onChanged() 메서드 호출
- observeForever(Observer) 메서드:
페어링된 LifecycleOwner 객체가 없는 관찰자 등록
-> 관찰자 항상 active 상태로 간주
-> 항상 변경사항 이벤트를 받음- removeObserver(Observer) 메서드:
위와 같은 관찰자 삭제
📌참고자료: LiveData setValue(), postValue() 차이
- setValue(T)
- MainThread에서 LiveData의 값 변경
- LiveData의 값을 즉각적으로 변경해야할 때 사용
- 백그라운드에서 setValue()를 호출하면 오류 발생
- postValue(T)
- 백그라운드에서 LiveData의 값 변경
- postValue()를 호출한 뒤 바로 getValue()로 값을 읽을 경우,
변경된 값을 읽어오지 못 할 가능성이 있다new Handler(Looper.mainLooper()).post(() -> setValue())