[Android] LiveDataでsetValueやpostValueで通知される順番

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が通知され、postValuesetValue が通知されたあとに通知される(当たり前)

予想では setValueした値はすべて通知されると思ってたんだけど、1つだけだった。ちょっと勉強になりましたとさ。

タイトルとURLをコピーしました