androidx.lifecycle.toLiveData()では内部的にpostValue()が使われているという話
androidのライブラリ lifecycle-reactivestreams-ktx にはRxJavaの Publisher<T>
を LiveData<T>
に変換する拡張関数 androidx.lifecycle.toLiveData()
がある。この関数が返してくるLiveDataの実装クラス LiveDataReactiveStreams.PublisherLiveData
は、RxのonNext()でオブジェクトを受け取るたび、LiveData.postValue()
に値を渡している*1。つまり、次のようなコード:
Flowable.just("a", "b", "c").toLiveData().observe(activity) { Timber.tag(TAG).d(it) }
では、"c"だけがログに出力されることになる。"a"も"b"も出力したいという場合には、toLiveData()を呼ぶ前の段階でフレームごとに一つだけ取得するようなスケジューラを挟む必要がある。あるいは、RxもLiveDataもやめて、Kotlin coroutinesのflowを使うという手もある。
しかしながら、実際のアプリで"a", "b", "c"のすべてが必要という場合にはLiveDataは使用すべきではなく、RxのクラスかFlow/Channelを使い、subscribeやcollectの中でイベントとして消費するようにしたほうがよい。
*1:ver. 2.2.0時点での挙動