Databinding과 함께 쓰면 찰떡궁합의 조합을 맛볼 수 있는, Android Jetpack 라이브러리의 기능 중 하나이다.
Live Data란?
- Data의 변경을 관찰할 수 있는 Data Holder 클래스
- 일반적인 Observable과는 달리 안드로이드의 생명주기(Life Cycle)를 알고 있다.
==> 그래서 웬만하면 Observable은 잘 쓰지 않는거였군...!!!!!
- 그래서 Live Data는 활성상태(active)일때만 데이터를 업데이트(Update)한다.
활성상태란 STARTED 또는 RESUMED를 의미한다.
- LiveData 객체는 Observer와 함께 사용된다. LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우, LiveData는 등록된 Observer 객체에 변화를 알려주고, Observer의 onChanged() 메소드가 실행된다.
Live Data가 어떻게 생명주기를 알지..?
- 바로 LifeCycleOwner라는 녀석이 안드로이드 생명주기(Android LifeCycle)를 알고있는 클래스라고 할 수 있다.
- 메서드가 오직 getLifeCycle() 밖에 없는 단일 메소드 인터페이스 클래스이며, Activity나 Fragment에서 이를 상속하고 있다.
- 한 마디로 LiveData의 Observer 메소드의 LifeCycleOwner를 Activity나 Fragment를 변수로써 사용한다면 각 화면 별 생명주기에 따라 LiveData는 자신의 임무를 수행합니다,
장점
- Data와 UI간 동기화 : LiveData는 Observer 패턴을 따른다. 그에 따라서 LiveData는 안드로이드 생명주기에 데이터 변경이 일어날 때마다 Observer 객체에 알려준다. 그리고 이 Observer 객체를 사용하면 데이터의 변화가 일어나는 곳마다 매번 UI를 업데이트 하는 코드를 작성할 필요가 없이 통합적이고 확실하게 데이터의 상태와 UI를 일치시킬 수 있다.
- 메모리 누수(Memory Leak)가 없다 : Observer 객체는 안드로이드 생명주기 객체와 결합되어 있기 때문에 컴포넌트가 Destroy 될 경우 메모리에서 스스로 해체한다.
- Stop 상태의 액티비티와 Crash가 발생하지 않는다 : 액티비티가 Back Stack에 있는 것처럼 Observer의 생명주기가 inactive(비활성화) 일 경우, Observer는 Live Data의 어떠한 이벤트도 수신하지 않는다.
- 생명주기에 대한 어떠한 handling도 하지 않아도 된다 : LiveData가 안드로이드 생명주기에 따른 Observing을 자동으로 관리해주기 때문에 UI 컴포넌트는 그저 관련있는 데이터를 "관찰"하기만 하면 된다.
- 항상 최신 데이터를 유지한다 : 화면 구성이 변경되어도 데이터를 유지한다. 예를 들어서, 디바이스를 회전하여 세로에서 가로로 화면이 변경될 경우에도 LiveData는 회전하기 전의 최신상태를 즉시 받아온다.
- 자원(Resource)를 공유할 수 있다 : LiveData를 상속하여 자신만의 LiveData 클래스를 구현할 수 있고, 싱글톤 패턴을 이용하여 시스템 서비스를 둘러싸면(Wrap) 앱 어디에서나 자원을 공유할 수 있다.
Live Data 사용 시 주의할 점
- Generic을 사용해 관찰하고자 하는 데이터의 타입을 갖는 Live Data 인스턴스를 생성한다.
(보통 Live Data 객체는 안드로이드 아키텍처 패턴의 ViewModel 클래스 내에서 함께 사용된다.)
- LiveData 클래스의 Observe() 메소드를 사용해 Observer 객체를 LiveData 객체에 "결합"한다. 이때 observer() 메소드는 LifecycleOwner 객체를 필요로 하며 보통은 Activity를 전달한다. LiveData에 저장된 데이터에 어떠한 변화가 일어난 경우 결합된 LifecyclerOwner에 의해서 상태가 active(활성)인 한 모든 데이터에 대해 Trigger가 발생한다.
- Observer 객체를 생성한다 : 생성시 LiveData가 들고있는 데이터가 변화가 일어났을 때 수행해야 할 로직이 들어있는 onChanged() 메서드를 정의해야 한다. 보통은 액티비티나 프래그먼트같은 UI Controller 내에서 해당 메서드를 생성한다.
- observeForever(Observer)를 통해 LifeCycleOwner 없이 Observer를 생성하여 등록할 순 있지만, 이 경우에는 Observer는 항상 active(활성) 상태이므로 데이터 변화를 전달받는다. 단, removeObserver(Observer) 메소드를 통해 Observer를 제거할 수 있다.