用了rxjava就不需要eventbus了之RxBus

PublishSubject,在官方文档中是这样描述的:
PublishSubject emits to an observer only those items that are emitted by the source Observable(s) subsequent to the time of the subscription
------------------------------PublishSubject本身作为观察者和被观察者。
既然选择了Rxjava,完全可以由PublishSubject代替eventbus进行事件通信。在这不管谁模仿谁的…
直接上代码:

public class RxBus {
    private static volatile RxBus sInstance;
    private final PublishSubject<Object> mEventBus = PublishSubject.create();

    public static RxBus getInstance(){
        if (sInstance == null){
            synchronized (RxBus.class){
                if (sInstance == null){
                    sInstance = new RxBus();
                }
            }
        }
        return sInstance;
    }

    /**
     * 发送事件(post event)
     * @param event : event object(事件的内容)
     */
    public void post(Object event){
        mEventBus.onNext(event);
    }

    /**
     *
     * @param code
     * @param event
     */
    public void post(int code,Object event){
        Message msg = new Message(code,event);
        mEventBus.onNext(msg);
    }

    /**
     * 返回Event的管理者,进行对事件的接受
     * @return
     */
    public Observable toObservable(){
        return mEventBus;
    }

    /**
     *
     * @param cls :保证接受到制定的类型
     * @param <T>
     * @return
     */
    public <T> Observable<T> toObservable(Class<T> cls){
        //ofType起到过滤的作用,确定接受的类型
        return mEventBus.ofType(cls);
    }

    public <T> Observable<T> toObservable(int code, Class<T> cls){
        return mEventBus.ofType(Message.class)
                .filter(msg -> msg.code == code && cls.isInstance(msg.event))
                .map( msg -> (T)msg.event);

    }

    class Message{
        int code;
        Object event;

        public Message(int code,Object event){
            this.code = code;
            this.event = event;
        }
    }
}

使用方法:

  1. 首先自定义一个bean类
public class RefreshLogin {
   //这里是你要传的参数
    public String message;

    public RefreshLogin(String message){
        this.message = message;
    }
}

  1. 注册
//这里的注册类似于eventbus,在收取信息的界面,在其初始化的方法里 做注册,比如oncreat()方法。
  RxBus.getInstance().toObservable(RefreshLogin.class)
              .observeOn(AndroidSchedulers.mainThread())
              .subscribe(event -> {
                      if (event.message != null ) {
                         //在这里进行操作
                      }
                  }
              });

  1. 发送
//这里不需要注册,直接调用即可,另外,在工程里我是做了manager,管理这个发送
 RxBus.getInstance().post(new RefreshLogin(message));

到现在,你就可以把引入的eventbus给删除了

猜你喜欢

转载自blog.csdn.net/julystroy/article/details/86648003
今日推荐