RxBus

3,726 阅读1分钟

相信大多数开发者都使用过EventBus或者Otto(我还未实践过),作为事件总线通信库,如果你的项目已经加入RxJava和EventBus(或Otto),那不妨用RxBus代替EventBus或者Otto,省去更多库的依赖。

RxJava

之前已经分享过RxJava知识,可以点击RxJava,这里不再细说。

RxBus

假设你已经对RxJava有所了解,再继续往下看。

public class RxBus {
    private static RxBus mRxBus = null;
    /**
     * PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
     */

    private Subject mRxBusObserverable = new SerializedSubject<>(PublishSubject.create());

    public static synchronized RxBus getInstance() {
        if (mRxBus == null) {
            mRxBus = new RxBus();
        }
        return mRxBus;
    }

    public void post(Object o) {
        mRxBusObserverable.onNext(o);
    }

    public Observable toObserverable() {
        return mRxBusObserverable;
    }

    /**
     * 判断是否有订阅者
     */
    public boolean hasObservers() {
        return mRxBusObserverable.hasObservers();
    }
}

代码调用

先模拟一个订阅者,用hasObservers判断是否有订阅者,然后再发送。

public class RxBusActivity extends AppCompatActivity {
    private CompositeSubscription mCompositeSubscription;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rx_bus);
        rxBusObservers();
        rxBusPost();
    }

    private void rxBusPost() {
        Log.d("wxl", "hasObservers=" + RxBus.getInstance().hasObservers());
        if (RxBus.getInstance().hasObservers()) {
            RxBus.getInstance().post(new TapEvent());
        }
    }

    private void rxBusObservers() {
        Subscription subscription = RxBus.getInstance()
                .toObserverable()
                .subscribe(new Action1() {
                    @Override
                    public void call(Object event) {
                        if (event instanceof TapEvent) {
                            //do something
                            Log.d("wxl", "rxBusHandle");
                        }
                    }
                });
        addSubscription(subscription);
    }

    public void addSubscription(Subscription subscription) {
        if (this.mCompositeSubscription == null) {
            this.mCompositeSubscription = new CompositeSubscription();
        }

        this.mCompositeSubscription.add(subscription);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (this.mCompositeSubscription != null) {
            this.mCompositeSubscription.unsubscribe();//取消注册,以避免内存泄露
        }
    }

    public class TapEvent {
    }
}

完整代码

github.com/WuXiaolong/…

EventBus源码解析

附上大牛们分析的EventBus源码,有兴趣可以看看
EventBus源码研读 by kymjs张涛
EventBus 源码解析 by Trinea