LiveData 정리

강보훈·2021년 12월 9일
0

MVVM 사용해보자

목록 보기
1/3

개요

  • LiveData는 관찰 가능한 데이터 홀더 클래스다. 내가 이해한 바로는 특정 데이터 타입에 대해서 변화가 일어나면 그 변화를 감지하고 지정해준 작업을 수행해준다.
  • 수명 주기를 인식한다. STARTED, RESUMED상태이면 관찰자를 활성 상태로 간주한다.
    LifeCycleOwner 인터페이스 구현 객체와 페어링된 관찰자를 등록할 수 있고 이 관계를 이용하면 수명 주기가 DESTROYED로 변경될 때 관찰자를 삭제할 수 있다. 이틑 Activity, Fragment에 유용하다. 이유는 LivaData 객체를 안전하게 관찰할 수 있고, 수명 주기가 끝나거든 즉시 수신 거부되어 누수를 걱정할 필요가 없기때문이다.

이점

  • UI와 데이터 상태의 일치 보장
    • DataBinding을 이용해서 데이터가 변경될 때마다 관찰자가 대신 UI를 업데이트해준다.
  • 메모리 누수 없음
    • 수명 주기를 인식함으로 연결된 수명 주기가 끝나면 자동으로 삭제한다.
  • 최신 데이터 유지
    • 수명 주기가 다시 활성화될 경우 최신 데이터를 수신한다. ex) 백그라운드에 있던 활동이 포그라운드로 돌아온 직후 데이터를 다시 받음
  • 적절한 구성 변경
    • 최신 데이터 유지와 비슷하게 기기 회전과 같은 구성 변경으로 인해 Activity나 Fragment가 재생성되면 사용 가능한 최신 데이터를 받아옴

gradle 셋팅

    def lifecycle_version = "2.4.0"
    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"

    implementation 'androidx.activity:activity-ktx:1.4.0'

사용 방법

  1. 특정 타입의 데이터를 보유할 LivaData 인스턴스 생성 이 작업은 일반적으로 ViewModel클래스 내에서 이뤄진다.

    class TestViewModel : ViewModel() {
    
        val liveData: MutableLiveData<String> by lazy {
            MutableLiveData<String>()
        }
    
    }
  2. onChanged() 메서드를 정의하는 Observer 객체를 만든다. 이 메서드는 LiveData 객체가 보유한 데이터 변경 시 발생하는 작업을 제어한다. 일반적으로 Activity나 Fragment 같은 UI 컨트롤러에 Observer 객체를 만든다.

  3. observe() 메서드를 사용하여 LiveData 객체에 Observer 객체를 연결한다. observe() 메서드는 LifecycleOwner 객체를 사용한다. 이렇게 하면 Observer 객체가 LiveData 객체를 구독하여 변경사항에 관한 알림을 받는다. 일반적으로 활동이나 프래그먼트와 같은 UI 컨트롤러에 Observer 객체를 연결합니다.

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            // other Setup
    
            val observer = Observer<String> {
                binding.liveDataTextView.text = it
            }
            viewModel.liveData.observe(this, observer)
    }
  • 주로 onCreate() 메서드가 LiveData 관찰 시작하기에 적합한 단계이다.
    • onResume() 메서드에서 중복 호출을 하지 않기 위해서
    • view가 활성 상태가 되는 즉시 표시할 수 있는 데이터가 포함되도록 하기 위해서이다.
      STARTED 상태가 되는 즉시 관찰하던 LiveData의 최신 값을 수신한다.

LiveData 객체 업데이트

  • LiveData는 저장된 데이터를 공개적으로 수정하는 메서드는 없다. MutableLiveData 클래스는 setValue(T), postValue(T) 메서드를 통해서 수정할 수 있다. 일반적으로 MutableLiveData는 ViewModel에서 사용되는데 ViewModel은 변경이 불가능한 LiveData만 관찰자에게 제공한다.
     binding.button.setOnClickListener {
                viewModel.liveData.value = "Another Name"
     }
  • 메인스레드에서 LiveData를 변경하려면 setValue(T)를 사용하면 되지만, 다른 스레드에서 실행된다면 postValue(T)를 사용해서 업데이트를 할 수 있다.

더 자세한 내용은

  • 나중에 시간이 되면 마저 정리하도록 하겠다. MVVM을 이해하기 위한 사전작업으로는 이정도면 충분하다고 생각한다. 공식문서를 참고해서 공부하는 것이 역시 이해가 잘되는 것 같다.
profile
3년차 안드로이드 개발자입니다.

0개의 댓글