はじめに
2~3年前、ottoのEventBusを使っていたが、RxJavaでも同じことが出来るってことを知ったので書いておく。
実装
Busクラスを作成する
Eventを投げるクラスを作成。こいつを介して様々な画面がEventを受け取れるようになる。
Java版
//
public class RxBus {
private RxBus() {
}
private static RxBus rxBus= null;
public static RxBus getInstance() {
if (rxBus== null) {
rxBus= new RxBus();
}
return rxBus;
}
private final PublishSubject<Object> bus = PublishSubject.create();
public Observable<Object> toObservable() {
return bus;
}
public boolean hasObservers() {
return bus.hasObservers();
}
public void send(final Object event) {
bus.onNext(event);
}
}
Kotlin版
//
class RxBus private constructor() {
private val bus = PublishSubject.create<Any>()
fun send(event: Any) {
bus.onNext(event)
}
fun toObservable(): Observable<Any> = bus
fun hasObservers() = bus.hasObservers()
companion object {
private var rxBus: RxBus? = null
fun getInstance(): RxBus {
if (rxBus == null) {
rxBus = RxBus()
}
return rxBus as RxBus
}
}
}
Eventを監視する
Java版とKotlin版で若干実装が違うけど治すの面倒だからこのままでw
Java版
//
private Disposable mDisposable = null;
private void setRxEvents() {
mDisposable = RxBus.getInstance().toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) {
if (o instanceof String) {
if (o.toString().equals("EVENT_NAME") {
// なにか処理
}
}
}
});
}
Kotlin版
//
private lateinit var disposable: Disposable
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
disposable = RxBus.getInstance().toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
when (it) {
"EVENT_NAME" -> {
// なにか処理
}
}
}
}
Eventを発火する
Event名を決めて発火する。Event名はConstantsとかに置けば良いと思う。
Java版
RxBus.getInstance().send("EVENT_NAME");
Kotlin版
RxBus.getInstance().send("EVENT_NAME");
あ、変わらないねw
Eventの監視をやめる
onDestroyとか特定のEvent拾ったときにやれば良いと思う。
Java版
if (mDisposable != null) {
mDisposable.dispose();
}
Kotlin版
disposable.dispose()
おわりに
使いすぎると黒魔術だとは思うけど、TOP画面から何画面か遷移した先でTOP画面の状態を更新したいときとかに使用すれば良いと思う。
Amazon.co.jp: Google Android グーグル アンドロイド アンドリュー・ベル ミニコレクタブル フィギュア/Andrew Bell Designer Toy Figure [並行輸入品] : おもちゃ
Amazon.co.jp: Google Android グーグル アンドロイド アンドリュー・ベル ミニコレクタブル フィギュア/Andrew Bell Designer Toy Figure : おもちゃ