fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

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時点での挙動