LiveDataを使い始めのときに微妙にハマったやつ。
連続で値を設定したときに通知される順番ってどうなるのよ?って検証してみた。
検証
とりあえず、雑なクラスを作っておく。
Fragment
class MainFragment : Fragment() {
companion object {
fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return inflater.inflate(R.layout.main_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java).apply {
liveData1.observe(this@MainFragment, Observer {
Log.d("hoge", it)
})
liveData2.observe(this@MainFragment, Observer {
Log.d("hoge", it)
})
liveData3.observe(this@MainFragment, Observer {
Log.d("hoge", it)
})
liveData4.observe(this@MainFragment, Observer {
Log.d("hoge", it)
})
confirm()
}
}
}
ViewModelを生成して、LiveDataを監視してログを出力するだけ。
VirewModel
// MainViewModel
class MainViewModel : ViewModel() {
val liveData1 = MutableLiveData<String>()
val liveData2 = MutableLiveData<String>()
val liveData3 = MutableLiveData<String>()
val liveData4 = MutableLiveData<String>()
fun confirm() {
// 全部setValue
liveData1.value = "liveData1 = 1"
liveData1.value = "liveData1 = 2"
liveData1.value = "liveData1 = 3"
liveData1.value = "liveData1 = 4"
// 全部postValue
liveData2.postValue("liveData2 = 1")
liveData2.postValue("liveData2 = 2")
liveData2.postValue("liveData2 = 3")
liveData2.postValue("liveData2 = 4")
// set,post,post,set
liveData3.value = "liveData3 = 1"
liveData3.postValue("liveData3 = 2")
liveData3.postValue("liveData3 = 3")
liveData3.value = "liveData3 = 4"
// post,set,set,post
liveData4.postValue("liveData4 = 1")
liveData4.value = "liveData4 = 2"
liveData4.value = "liveData4 = 3"
liveData4.postValue("liveData4 = 4")
}
}
LiveDataにえいやーって値を設定するだけw
結果
21:20:34.195 4846-4846/? D/hoge: liveData1 = 4
21:20:34.195 4846-4846/? D/hoge: liveData3 = 4
21:20:34.195 4846-4846/? D/hoge: liveData4 = 3
21:20:34.210 4846-4846/? D/hoge: liveData2 = 4
21:20:34.211 4846-4846/? D/hoge: liveData3 = 3
21:20:34.211 4846-4846/? D/hoge: liveData4 = 4
最後のsetValueが通知され、postValueは setValue が通知されたあとに通知される(当たり前)
予想では setValueした値はすべて通知されると思ってたんだけど、1つだけだった。ちょっと勉強になりましたとさ。