LiveData vs ObservableField 무엇을 써야 할까?

DataBinding을 사용하는 분들이라면 LiveData 또는 ObservableField를 사용해 보셨을 겁니다.
그런데 ObservableField와 LiveData 중 어떤 것을 사용해야 할까요?

우선 결론부터 말씀드리자면 저는 LiveData를 추천합니다.

그럼 이제 이 둘을 비교해볼까요?

참고
여기서 말하는 ObservableField는 ObservableInt, ObservableMap과 같은 모든 것을 의미합니다.

사용법

ObservableField

ObservableField는 DataBinding을 활성화해야 사용 가능합니다.

private val observableString = ObservableField<String>("Default value")

observableString.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
    override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
        //Do something
    }
})

LiveData

LiveData를 사용하려면 Lifecycle 종속성을 추가해야 합니다.

private val observableString = MutableLiveData<String>("Default value")

observableString.observe(lifecycleOwner, Observer {
    //Do something
})

차이점

둘다 observe한다는 것은 똑같지만 LiveData를 observe 할 때는 lifecycleOwner라는 인자가 하나 더 들어갔죠.
(LiveData도 observeForever라는 메소드로 lifecycleOwner 없이 observe 할 수 있지만 권장하는 사항은 아닙니다.)
이 코드에서 사용한 lifecycleOwner는 Activity입니다. val lifecycleOwner = this

여기서 LiveData와 ObservableField의 큰 차이점이 드러납니다.

LiveData는 lifecycle을 인지하고 자동으로 observe 상태를 관리해줍니다.

이로인해 생기는 장점

  1. ObservableField는 Observer를 추가하고 이를 removeOnPropertyChangedCallback메소드를 사용하여 직접 제거해야 하지만
    LiveData는 사용되지 않을 때 자동으로 observing을 해제했다가 사용될 때 다시 observe하게 됩니다.
  2. 불필요한 observing이 사라집니다.
  3. 이로인해 메모리 누수의 위험이 사라집니다.

이와 관련된 한가지 실험을 해봤습니다.
액티비티가 onStop되면 값이 변경되게 하고, LiveData와 ObservableField의 값의 변화를 관찰했습니다.

class MainActivity : AppCompatActivity() {
    private val observableField = ObservableField("default")
    private val liveData = MutableLiveData("default")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        observableField.addOnPropertyChangedCallback(object : Observable.OnPropertyChangedCallback() {
            override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
                Log.d("testing", "ObservableField: ${observableField.get()}")
            }
        })

        liveData.observe(this, Observer {
            Log.d("testing", "LiveData: ${liveData.value}")
        })
    }

    override fun onStop() {
        super.onStop()
        observableField.set("changed")
        liveData.value = "changed"
    }
}

앱을 실행시키고 홈 화면으로 나갔습니다.
역시나 ObservableField는 나가자 마자 로그에 값이 변경되었다고 떴고,
LiveData는 나간 후에는 로그가 뜨지 않다가 다시 앱에 들어가니 로그가 떴습니다.

DataBinding

DataBinding을 위해서 xml에 코드를 작성하는 방법은 같습니다.
하지만 LiveData를 사용한다면 아래와 같이 lifecycleOwner를 설정해줘야 합니다.

val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
binding.lifecycleOwner = this

결론

특별한 상황이 아니라면 ObservableField 보단 LiveData를 사용하세요.

이 문서에 장점이 잘 나와있으니 읽어보시면 좋을 것 같네요.

더불어 LiveData를 ViewModel에서 사용할 때는 이런식으로 mutable한 LiveData는 private으로 숨겨서 값의 변경이 ViewModel에서만 일어나도록 보장 하는 방식을 많이 사용합니다.

class MainViewModel : ViewModel() {
    private val _exampleValue = MutableLiveData("")
    val exampleValue: LiveData<String> = _exampleValue
}

글 읽어주셔서 감사합니다!
질문이나 피드백은 환영입니다😊

참고

LiveData Overview

Tags: , ,

Categories:

Updated:

블로그에 기여하기

Leave a comment