経緯
以前イベントバスとしてOttoを使用していたが、RxJavaを使ったほうがよい実装ができるので、Deprecatedとなったようだ。
以前、KotlinでRxを使ったイベントバスを作成していたので、Java化してライブラリとして公開してみることにした。
RxEventBus
簡単な使用方法はREADMEを参照。
特徴
- イベントクラスは
Event
クラスを継承する必要がある。 - ハンドラ登録は
RxEventBus#subscribe()
で行う。-
RxEventBus#subscribe()
の戻り値であるSubscription
に対してunsubscribe()
することで、ハンドリングをやめる。 - 第3パラメーターに
Scheduler
を渡すことで、第2パラメーターのラムダの実行スレッドを変更できる。
-
- イベント送信は
RxEventBus#post()
で行う。- イベントが一度もハンドリングされなかった場合、第2パラメーターのラムダが呼ばれる。
- ハンドラに
Scheduler
が指定されていた場合、ハンドラのラムダが実行されたかどうかは保証できない。- post時点でハンドラがあるかどうかしか判断できないため。
Usage
DaggerなどDIを使っている想定で記述する。
MainActivityでイベントを拾い、MainFragmentがイベントを投げる構成。
Android(Kotlin)での例
// イベントを定義
class MyEvent {
val answer = 42
}
// イベントを拾うActivity
class MainActivity : Activity() {
@Inject lateinit var bus: RxEventBus
private lateinit var subscription: Subscription
override fun onStart() {
super.onStart()
subscription = bus.subscribe(MyEvent.class, { Log.v(TAG, "${it.answer}") })
}
override fun onStop() {
subscription.unsubscribe()
super.onStop()
}
}
// イベントを投げるFragment
class MainFragment : Fragment() {
@Inject lateinit var bus: RxEventBus
private fun postMyEvent() {
// MainActivityによって拾われ、42がログ出力される
bus.post(MyEvent())
}
private fun postOtherEvent() {
// 拾われることがなく、Event is not handled.がログ出力される
bus.post(OtherEvent(), { Log.v(TAG, "Event is not handled.") })
}
}
追記
バージョンアップにより、Event
クラスの継承が不要になりました。