RxBus
首先RxBus并不是一个库,只是通过使用RxJava实现的事件总线的通讯工具,比起EventBus,RxJava的实现代码更加简介,因为其本身就是观察者设计模式拓展而来。
RxBus相关资料:
http://nerds.weddingpartyapp.com/tech/2014/12/24/implementing-an-event-bus-with-rxjava-rxbus/
RxBus实现源码:
package com.che58.ljb.rxjava.rxbus;
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;
/**
* RxBus
*/
public class RxBus {
//private final PublishSubject<Object> _bus = PublishSubject.create(); //线程不安全
private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create()); //线程安全
public void send(Object o) {
_bus.onNext(o);
}
/**获取实际的Bus对象*/
public Observable<Object> toObserverable() {
return _bus;
}
/**是否含有观察者*/
public boolean hasObservers() {
return _bus.hasObservers();
}
}
是不是很眼熟?没错,RxBus就是通过PublishSubject实现,其实早
(八)RxJava:PublishSubject 中,我就已经实现了RxBus类似的功能(一个线程不安全的RxBus)。
这里也就不另写Demo,直接引用@
kaushikgopal大神的Demo.
1、外部定义公共的RxBus对象(MainActivty中)
private RxBus _rxBus = null;
/**获取RxBus对象*/
public RxBus getRxBusSingleton() {
if (_rxBus == null) {
_rxBus = new RxBus();
}
return _rxBus;
}
2、TopFragment触发事件,并发出通知
@OnClick(R.id.btn_demo_rxbus_tap)
public void onTapButtonClicked() {
if (_rxBus.hasObservers()) { //是否有观察者,有,则发送一个事件
_rxBus.send(new RxBusDemoFragment.TapEvent());
}
}
3、BottomFragment订阅事件
//将普通的Observable转换为可连接的Observable值得一提的时,rxbus在订阅多个观察者(订阅者)时,使用了publish()操作符,该操作符会返回一个可连接的被观察者,该被观察者并不会在订阅时立即发出数据序列,当其调用connect()操作符时才会发出数据序列。
ConnectableObservable<Object> tapEventEmitter = _rxBus.toObserverable().publish();
tapEventEmitter
.compose(this.bindToLifecycle())
.subscribe(new Action1<Object>() { //一个一旦被触发就会显示TapText的监听者
@Override
public void call(Object event) {
if (event instanceof RxBusDemoFragment.TapEvent) {
_showTapText();
}
}
});
tapEventEmitter
.compose(this.bindToLifecycle())
.publish(new Func1<Observable<Object>, Observable<List<Object>>>() {//一个出发后缓存一秒内的点击数并显示的监听者
@Override
public Observable<List<Object>> call(Observable<Object> stream) {
return stream.buffer(stream.debounce(1, TimeUnit.SECONDS)); //进行缓冲1秒,打包发送
}
}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<List<Object>>() {
@Override
public void call(List<Object> taps) {
_showTapCount(taps.size());
}
});
tapEventEmitter.connect(); //可连接的Observable并不在订阅时触发,而需手动调用connect()方法
效果图: