📌 LiveData
= 생명주기(LifeCycle)를 알고 있으며, 데이터를 들고 있는 클래스 (Data Holder Class)
📓 데이터를 들고있는 이유
LifeCycleOwner의 LifeCycle에 따라 이 데이터를 처리함으로써 여러 이점을 확보하기 위해서.
📒 LifeCycleOwner란
안드로이드 생명주기 (Android LifeCycle)를 알고 있는 클래스라 보면 된다. 메소드가 오직 getLifeCycle() 밖에 없는 단일 메소드 인터페이스 클래스이며, Activity나 Fragment에서 이를 상속하고 있다. 즉 저 둘은 LifeCycleOwner이기도 하다는 것이다. (26.1 버전 이상, 그전에는 직접 implements 해야함)
한 마디로 LiveData의 observer 메소드의 LifeCycleOwner 값에 Activity나 Fragment를 변수로써 넣는다면, 이들의 생명주기에 따라 LiveData는 행동한다는 것이다.
📗 LiveData의 행동 방식
LiveData는 LifeCycleOwner가 START나 RESUME 상태에 다다르면 활성화 상태가 되어, 할당된 값이 변할 경우 observe 메소드로 인해 참조하고 있는 Observer의 onChanged 메소드를 발동시켜 이벤트를 전달한다. 또한 LifeCycleOwner가 START나 RESUME이 아닌 상태가 되면, 비활성화되어 이벤트를 전달하지 않는다.
LifeCycleOwner가 Destory되게 되면 할당된 Observer 역시 Destory된다.
LifeCycleOwner가 Destroy되지 않는 한 할당된 Observer를 강한 참조한다.
이미 LifeCycleOwner가 있는데도 불구하고 또다른 LifeCycleOwner를 참조시킬 경우 IllegalArgumentException이 발생한다.
📘 그래서 LifeCycle에 따라 데이터를 처리하면 이점이 뭔데?
- LiveData의 존재 이유
0. 메모리 누수(memory leak) 방지
LifeCycleOwner가 Destoryed되면 자신과 Observer 역시 Clean-up 된다.
1. LifeCycle Stop에 따른 Crash 방지
LifeCycleOwner가 BackStack으로 들어가 비활성화 상태일 경우, 별다른 조치를 해주지 않으면 크래쉬가 날 수 있는 상황을
미연에 방지해준다.
2. LifeCycleOwner 재시작 시 active상태임을 포착하고 자신이 들고있는 데이터를 바로 넘긴다.
다시 활성화 상태로 돌아왔을 때 특별한 호출을 따로 해주지 않아도, 가장 마지막인 최신 데이터를 갱신해주므로 편하다.
3. 위의 모든 장점의 결론은 개발자의 실수를 줄여준다는 것이다. WOW
📙 LiveData 필수 외전
LiveData가 이벤트를 전달하기 전에, 그 이벤트의 데이터를 변경시킬 방법 2가지.
그것은 바로 Transformation - 링크을 사용하는 것이다.
Transformation.map 의 경우 내부에 MediatorLiveData를 두어 map에 부여된 LiveData를 관찰하도록 구현되어 있다. 할당된 LiveData의 Data가 변하여 넘어온 값을 변형시켜 다른 값으로 전달 할수 있는 역할을 한다.
Transformation.switchMap의 경우는 map과 다르게, LiveData를 return하며, 주로 Model Repository나 비동기 처리 등에 사용된다.
MediatorLiveData - 링크란, addSource 메소드로 여러 LiveData를 자신이 관찰 가능하며, 해당 LiveData가 변할 경우 이벤트를 발생하는 역할을 담당한다.
Mediator 란 중재자 란 뜻으로써, 여러 LiveData를 중재한다는 뜻으로 생각하면 쉽다.
'Android' 카테고리의 다른 글
[Android] SingleLiveEvent의 원리 (2) | 2020.02.04 |
---|---|
[Android] 생명주기 테스트 (0) | 2020.01.20 |
[Android] Activity 좌우로 전환 애니메이션 적용하기 (0) | 2020.01.08 |
[Android/안드로이드] 구글 퓨시아(fuchsia) 개발자 사이트 (0) | 2019.10.08 |
[안드로이드/Android] TextInput Component 색상 변경 (0) | 2019.10.07 |