[Android] Deep dive into LiveData #1 -Overview

choi jeong heon
슬기로운 개발생활
7 min readNov 1, 2021

선행지식

Android Jetpack

Overview

LiveData 는 Android Jetpack 구성요소 중 하나입니다.
Android docs 에서는 LiveData를 다음과 같이 소개하고 있습니다.

LiveData is an observable data holder class. Unlike a regular observable, LiveData is lifecycle-aware, meaning it respects the lifecycle of other app components, such as activities, fragments, or services.
This awareness ensures LiveData only updates app component observers that are in an active lifecycle state.

정리하자면 LiveData의 핵심은

  1. observable
    LiveData를 관찰할 수 있다.
  2. data holder
    LiveData는 Data를 가지고 있다.
  3. lifecycle-aware
    관찰자의 수명주기를 인식한다.

이라는 점 인데요,

LiveData는 Observer 클래스로 표현되는 관찰자의 수명주기가 STARTED 또는 RESUMED 상태이면 LiveData는 관찰자를 active 상태로 간주합니다.

LiveData 객체를 관찰하기 위해 등록된 inactive 상태의 관찰자는 변경사항에 관한 알림을 받지 않습니다.

그렇다면 LiveData 관찰자는 아무나 될 수 있을까요?

You can register an observer paired with an object that implements the LifecycleOwner interface.

LifecycleOwner 인터페이스를 구현하는 객체여야 합니다.
LifecycleOwner의 구현체에는 어떤 것들이 있을까요?

LifecycleOwner 구현체

LiveDataActivityFragment에 유용합니다. ActivityFragmentLiveData 객체를 안전하게 관찰할 수 있고, 수명 주기가 끝나는 즉시 unsubscribed 되어 누수(leaks) 를 걱정하지 않아도 됩니다.

이 관계를 사용하면 관찰자에 대응되는 Lifecycle 객체의 상태가 DESTROYED로 변경될 때 관찰자를 삭제할 수 있습니다.

LiveData 장점?

docs 에서는 LiveData 장점으로 아래 내용을 언급하고 있습니다.

  1. Ensures your UI matches your data state
    LiveData는 옵저버 패턴을 따릅니다. LiveData는 기본 데이터가 변경될 때 Observer 객체에 알립니다. 이렇게 하면 앱 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트하므로 개발자가 업데이트할 필요가 없습니다.
  2. No memory leaks
    관찰자는 Lifecycle 객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제됩니다.
  3. No crashes due to stopped activities
    만약 관찰자의 Lifecycle 상태가 inactive 가 되면 (ex. activity가 back stack 에들어갈때) 관찰자는 더 이상 LiveData의 event를 수신하지 않습니다.
  4. No more manual lifecycle handling
    UI 구성요소는 관련 데이터를 관찰하기만 할 뿐, 관찰을 중지하거나 다시 시작하지 않습니다. LiveData는 관찰하는 동안 관련 수명 주기 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리합니다.
  5. Always up to date data
    수명주기가 inactive 한 상태가 되고 다시 active 한 상태가 될 때 최신 데이터를 수신합니다. 예를 들어, 백그라운드에 있었던 액티비티는 포그라운드로 돌아온 직후 최신 데이터를 받습니다.
  6. Proper configuration changes
    기기 회전과 같은 구성 변경으로 액티비티 또는 프래그먼트가 다시 생성되면, 사용 가능한 최신 데이터를 즉시 받게 됩니다.
  7. Sharing resources
    앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData 객체를 확장하여 시스템 서비스를 래핑할 수 있습니다. LiveData 객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData 객체를 볼 수 있습니다.

LiveData 사용법

간단한 LiveData의 사용 예시는 다음과 같습니다.

  1. 특정 유형의 데이터를 보유할 livedata의 인스턴스를 생성. 이 작업은 일반적으로 ViewModel 클래스 내부에서 이루어집니다.
  2. onChanged() 메서드를 정의하는 Observer 객체를 만듭니다. 이 메서드는 LiveData 객체가 보유한 데이터 변경 시 발생하는 작업을 제어합니다. 일반적으로 액티비티나 프래그먼트 같은 UI 컨트롤러에 observer 객체를 생성합니다.
  3. observe() 메서드를 사용하여 LiveData 객체에 Observer 객체를 연결합니다. 이렇게 하면 Observer 객체가 LiveData 객체를 구독하여 변경사항에 관한 알림을 받습니다. 일반적으로 액티비티나 프래그먼트와 같은 UI 컨트롤러에 Observer 객체를 연결합니다

Observer 클래스는 다음과 같이 정의되어 있습니다.

참고: observeForever(Observer) 메서드를 사용하여 연결된 LifecycleOwner 객체가 없는 관찰자를 등록할 수 있습니다. 이 경우 관찰자는 항상 active 상태로 간주되며 따라서 항상 수정에 관한 알림을 받습니다. removeObserver(Observer) 메서드를 호출하여 이러한 관찰자를 삭제할 수 있습니다.

LiveData 객체의 value를 update 하면, LifecycleOwner가 활성 상태에 있는 등록된 모든 observer 에게 알림을 보냅니다.

Livedata 객체에서 보유한 데이터가 변경되면 onChanged()를 호출하여 변경사항을 알리게 됩니다.

참고: 다음과 같은 이유로 액티비티나 프래그먼트가 아닌 Viewmodel 개체에 UI를 업데이트하는 LiveData 개체를 저장해야 합니다.액티비티와 프래그먼트가 커지지 않게 하기 위해. 이제는 이러한 UI 컨트롤러가 데이터를 표시를 담당하고 데이터 상태를 보유하지 않는다.LiveData 인스턴스를 특정 액티비티나 프래그먼트 인스턴스에서 분리하고 구성 변경(화면 회전 등)에도 livedata 객체가 유지되도록 하기 위해서.

다음글

--

--