ライフサイクルを加味してくれて、データバインディングできるLiveDataについてメモ書き。
参考文献
LiveDataとは
observableなデータホルダー。ライフサイクルを加味してよしなに、observerへデータ送信したり、該当のactivityなどがdestroyされたときは、observerを自動でremoveしてくれる。
LiveDataの利点
- データの状態をうけとり、UIに自動で反映できる
- メモリリークしない
- アクティビティがBackStaskにあるときには、データ通知されない
- 自分で、ライフサイクル管理しなくていい
- BackStackからアクティブになった瞬間、最新のデータを受け取れる
- 画面回転などで、アクティビティを作り直した時も、最新のデータを受け取れる
- シングルトンでラップすれば、いろんな場所からLiveDataを購読できる
LiveDataの使い方
- LiveDataインスタンスを作成する。(通常、ViewModel内で行われる)
- LiveDataの変更をうけとるonChanged()メソッドをもったObserverをつくる(通常、ActivityやFragmentにて)
- observe()メソッドで、ObserverとLiveDataを紐付ける。このとき、LifecycleOwnerを紐付けることで、ライフサイクル管理をよしなにできる。
- LiveDataインスタンスの値変更は、メインスレッド上ならsetValue()、バックグラウンドならpostValue()を使う
kotlin実装イメージ
ViewModel
val nameLiveData: MutableLiveData<String> = MutableLiveData()
fun onButtonClicked() {
nameLiveData.value = "hello world"
}
Activity
nameLiveData.observe(this, Observer {
binding.name.text = it
})
メモ
- ObserverのonChanged()メソッドは、setValueした都度、データに変更があろうとなかろうと呼ばれる
- DataBindingでLiveDataを購読したときは、元のデータとsetValueされたデータに違いがないと、呼ばれないぽい