LiveData

h_hi·2021년 3월 11일
1

AAC

목록 보기
4/8

LiveData

LiveData 는 관찰 가능한(Observable) 데이터 클래스입니다. LiveData는 Lifecycle 을 통해 생명 주기를 인식합니다.
즉, 주어진 LifecycleOwner (액티비티, 프래그먼트, 서비스와 컴포넌트들) 의 생명 주기가 STARTED 또는 RESUME 상태인 경우만 Observer 를 활성(active) 상태로 봅니다.
LiveData의 장점들은 아래와 같습니다.

  • UI와 data 의 동기화
  • memory leak 없음
  • 액티비티가 갑작스럽게 종료될 때도 안전하다
  • 생명 주기에 대한 고민 필요 없음
  • 최신의 데이터를 유지한다
  • 구성 변경에 대응한다
  • 자원 공유하기

DataBinding 과 LiveData 사용하기

dataBinding 과 liveData를 사용하면 lifecycle 에 대한 걱정없이 데이터의 변경에 따른 UI 변경을 자동으로 처리하도록 설정할 수 있습니다.

  1. 바인딩 클래스에 LifecycleOwner를 명시하여, 생명주기를 인식하도록 합니다.
binding.lifecycleOwner = this
  1. ViewModel 에서 LiveData 생성할 때, ViewModel 에서만 값을 변경할 수 있도록 하는것이 보안에 좋습니다. 참조될 때는 LiveData, ViewModel 내에서는 MutableLiveData 로 변환하여 사용합니다.
private val _hideKeyBoardEvent = MutableLiveData<Unit>()
val hideKeyBoardEvent: LiveData<Unit> = _hideKeyBoardEvent
  1. 위와 같은 데이터를 Activity에서 observe 하도록 합니다.
vm.hideKeyBoardEvent.observe(this, Observer {
   ...
}) 
  1. xml 에서 dataBinding 합니다.
android:onClick="@{()->vm.hideKeyBoardEvent()}"

setValue, postValue

  • setValue 는 mainThread 에서 값을 변경해줍니다. 그렇기 때문에, setValue 바로 뒤에 getValue를 해도 변경된 값을 받아옵니다. setValue 는 mainThread 에서 값을 dispatch 하기 때문에 백그라운드에서 setValue 를 호출하면 오류가 발생합니다.
  • postValue 는 백그라운드에서 값을 변경합니다. 백그라운드 thread에서 동작하다가 mainThread 로 값을 post 해주는 방식으로 동작합니다. 함수 내부적으로는 아래와 같은 코드가 동작합니다.
    postValue 를 호출한 뒤 바로 getValue로 값을 읽으려고 하면, 변경되지 않은 값을 불러올 수도 있습니다. Handler 를 통해 mainThread 에 값이 적용되기 전에 getValue 로 호출하기 때문입니다.
new Handler(Looper.mainLooper()).post(() -> setValue())

Reference

android developer
해리의 유목코딩
꾸준하게

profile
안드로이드, flutter 개발자

0개의 댓글