[Android]RxJavaを使ってEventBusを実現する

スポンサーリンク

はじめに

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 : おもちゃ
タイトルとURLをコピーしました