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つだけだった。ちょっと勉強になりましたとさ。


