- LiveData는 Lifecycle을 따른다. --- 확장 병합 소스 변환 부분은 들어가서 참고 ㅠ ---
- LiveData는 Observer 역할을 한다.
- Observer는 main thread에서 호출된다.
- 대응되는 Lifecycle이 Destroyed되면 해당 LiveData의 Observer 또한 제거된다.
- 메모리 누수를 걱정할 필요가 없다.
- setValue → main Thread
- postValue → worker Thread (Background Thread)
- LiveData는 UI 영역(Activity, Fragment, ViewModel에서만 사용하자)
- LiveData는 LifeCycle에 묶여 있으며 observe는 main thread에서 호출된다.
- repository에서 오래 걸리는 작업을 하게 되면 main thread는 블록킹 될 수 있다.
- Kotlin flow를 사용하자.
LiveData관찰 가능한 데이터 홀더 클래스입니다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식합니다. 즉, 활동, 프래그먼트, 서비스 등 다른 앱 구성요소의 수명 주기를 고려합니다. 수명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트합니다.
Observer 클래스로 표현되는 관찰자의 수명 주기가 STARTED 또는 RESUMED 상태이면 LiveData는 관찰자를 활성 상태로 간주합니다. LiveData는 활성 관찰자에게만 업데이트 정보를 알립니다. LiveData 객체를 보기 위해 등록된 비활성 관찰자는 변경사항에 관한 알림을 받지 않습니다.
LifecycleOwner 인터페이스를 구현하는 객체와 페어링된 관찰자를 등록할 수 있습니다. 이 관계를 사용하면 관찰자에 대응되는 Lifecycle 객체의 상태가 DESTROYED로 변경될 때 관찰자를 삭제할 수 있습니다. 이는 특히 활동 및 프래그먼트에 유용합니다. 활동과 프래그먼트는 LiveData 객체를 안전하게 관찰할 수 있고, 수명 주기가 끝나는 즉시 수신 거부되어 누수를 걱정하지 않아도 되기 때문입니다.
LiveData 사용의 이점
UI와 데이터 상태의 일치 보장
LiveData는 관찰자 패턴을 따릅니다. LiveData는 기본 데이터가 변경될 때 Observer 객체에 알립니다. 코드를 통합하여 이러한 Observer 객체에 UI를 업데이트할 수 있습니다. 이렇게 하면 앱 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트하므로 개발자가 업데이트할 필요가 없습니다.
메모리 누수 없음
관찰자는 Ligecycle객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됩니다.
중지된 활동으로 인한 비정상 종료 없음
활동이 백 스택에 있을 때와 같이 관찰자의 수명 주기가 비활성 상태이면 관찰자는 어떤 LiveData 이벤트도 받지 않습니다.
수명 주기를 더 이상 수동으로 처리하지 않음
UI 구성요소는 관련 데이터를 관찰하기만 할 뿐 관찰을 중지하거나 다시 시작하지 않습니다. LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리합니다.
최신 데이터 유지
수명 주기가 비활성화되면 다시 활성화될 때 최신 데이터를 수신합니다. 예를 들어 백그라운드에 있었던 활동은 포그라운드로 돌아온 직후 최신 데이터를 받습니다.
적절한 구성 변경기기 회전과 같은 구성 변경으로 인해 활동 또는 프래그먼트가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받게 됩니다.
리소스 공유
앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있습니다. LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있습니다.
LiveData 객체 만들기
collections를 구현하는 list와 같은 객체를 비롯하여 모든 데이터와 함께 사용할 수 있는 레퍼 입니다. livedata 객체는 일반적으로 viewModel 객체 내에 저장되며 다음 예에서 보는 것과 같이 getter 메서드를 통해 엑세스 됩니다.
class NameViewModel : ViewModel() {
// Create a LiveData with a String
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
// Rest of the ViewModel...
}
Room으로 LiveData 사용
Room 지속성 라이브러리는 관찰 가능한 쿼리를 지원하며 이 쿼리는 Livedata 객체를 반환합니다. 관찰 가능한 쿼리는 DAO(Database Access Object)의 일부로 작성됩니다.