スポンサーリンク

【Android】LiveDataでListを扱った時の通知の有無

スポンサーリンク

LiveDataでListを扱う際に,どの場合にObserverに通知が飛ぶのか不明確であったので調査しました.記事としては沢山ありそうなので備忘録です.

以下のようにViewModelでLiveDataを定義しているとします

val testLiveData = MutableLiveData<MutableList<String>>(mutableListOf())

①LiveDataのListに変更を加えたとき

通知されません.

viewModel.testLiveData.value?.add("test")

②LiveDataのListを置き換えた場合

通知されます

val data = viewModel.testLiveData.value
data?.add("test")
viewModel.testLiveData.postValue(data)

③LiveDataのListを同一のインスタンスで置き換えた場合

通知されます.インスタンスの同一性については特にチェックされていません

 viewModel.testLiveData.postValue(viewModel.testLiveData.value)

まとめ

以上から,発火点はpostValue,setValueを実施した時,ということが分かりました.これで安心して実装できます.

(補足)MutableLiveDataとLiveDataの使いどころ

MutableLiveDataはviewModel内で使用し,viewModel以外で使用する(監視させる)際にはLiveDataとして公開します.こうすることで所定のLiveDataが不用意にUIレイヤーで変更されることを防止できます.

LiveData overview  |  Android Developers
Use LiveData to handle data in a lifecycle-aware fashion.
タイトルとURLをコピーしました