Android
Kotlin
RxJava
DataBinding

ObservableFieldをFlowableに変換

目的

入力した値に応じてボタンなどの制御がしたい。入力値を監視するためにObservableFieldをFlowableに変換する必要がある。

対応内容

参考にさせていただいたサイトにObservableFieldをObservableに変換する内容がありましたので、ObservableをFlowableに変更する形で、以下のユーティリティクラスを作成しました。

object RxUtils {

  /**
   * ObservableField -> Flowable変換
   *
   * @param observableField ObservableField
   * @return Flowable
   */
  fun <T> toFlowable(observableField: ObservableField<T>): Flowable<T> {
    return Flowable.create({ emitter ->
      val callback = object : OnPropertyChangedCallback() {
        override fun onPropertyChanged(dataBindingObservable: android.databinding.Observable, propertyId: Int) {
          if (dataBindingObservable === observableField) {
            emitter.onNext(observableField.get())
          }
        }
      }
      observableField.addOnPropertyChangedCallback(callback)
      emitter.setCancellable({ observableField.removeOnPropertyChangedCallback(callback) })
    }, BackpressureStrategy.LATEST)
  }
}

参考

RxJava meets Android Data Binding