美文网首页
Rxbus实现事件总线(RxJava2.0)

Rxbus实现事件总线(RxJava2.0)

作者: PradaSkr | 来源:发表于2017-09-16 17:54 被阅读0次

封装base的时候想到事件分发 既然用到了Rxjava 很神奇的发现了Rxbus这个东西,那就学习下~
Github:https://github.com/balckban/RxbusDemo-RxJava2.0-

ezgif-1-3b2413c862.gif
  1. 首先是gradle的配置

compile "io.reactivex.rxjava2:rxjava:2.1.3"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

  1. RxBus写法
    背压式处理 很详细http://flyou.ren/2017/04/05/关于RxJava背压/
    1.没有做背压式处理
private final Subject<Object> _bus;


    private static class RxHolder{
        private static volatile RxBus sRxBus = new RxBus();
    }

    private RxBus() {
        _bus = PublishSubject.create().toSerialized();
    }
    public static RxBus getInstance(){
        return RxHolder.sRxBus;
    }
    public void send(Object o){
        if (hasObserve()) {
            _bus.onNext(o);
        }
    }

    private boolean hasObserve() {
        return _bus.hasObservers();
    }
    public Observable<Object> toObservable(){
        return _bus;
    }
    // 根据传入的事件类型,返回特定类型的eventType的被观察者
    public <T extends Object> Observable<T> toObservable(Class<T> event){
        return _bus.ofType(event);

    }

2.背压式处理代码

   private final FlowableProcessor<Object> _bus;

    private RxBus() {
        // toSerialized method made bus thread safe
        _bus = PublishProcessor.create().toSerialized();
    }

    public static RxBus getInstance() {
        return Holder.BUS;
    }

    public void send(Object obj) {
        _bus.onNext(obj);
    }
/**
 * 根据传递的 eventType 类型返回特定事件类型的被观察者
 */
    public <T> Flowable<T> toFlowable(Class<T> tClass) {
        return _bus.ofType(tClass);
    }

    public Flowable<Object> toFlowable() {
        return _bus;
    }

    public boolean hasSubscribers() {
        return _bus.hasSubscribers();
    }

    private static class Holder {
        private static final RxBus BUS = new RxBus();
    }

3.Rxbus使用
接收


        RxBus.getInstance().toFlowable(输入自己特定的class 比如TestEvent.class 区分事件).subscribe(new Consumer<Object>() {

            @Override
            public void accept(Object o) throws Exception {
                Toast.makeText(MainActivity.this, "已发送", Toast.LENGTH_SHORT).show();
                if (((TestEvent) o).getTest() != null) {
                    mTvReceive.setText(((TestEvent) o).getTest());
                }
            }
        });

    }

   

发送

mBtnReturn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                RxBus.getInstance().send(new TestEvent(mEtNext.getText().toString()));
                finish();
            }
        });

相关文章

网友评论

      本文标题:Rxbus实现事件总线(RxJava2.0)

      本文链接:https://www.haomeiwen.com/subject/creysxtx.html