(九)RxJava:RxBus

来源:互联网 发布:算法导论第三版.pdf 编辑:程序博客网 时间:2024/05/16 15:37

博客首页

        


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
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()方法
        值得一提的时,rxbus在订阅多个观察者(订阅者)时,使用了publish()操作符,该操作符会返回一个可连接的被观察者,该被观察者并不会在订阅时立即发出数据序列,当其调用connect()操作符时才会发出数据序列。






        效果图:

                    

源码: https://github.com/cn-ljb/rxjava_for_android

0 0
原创粉丝点击