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;
}
}
}
使用方法:
- 首先自定义一个bean类
public class RefreshLogin {
//这里是你要传的参数
public String message;
public RefreshLogin(String message){
this.message = message;
}
}
- 注册
//这里的注册类似于eventbus,在收取信息的界面,在其初始化的方法里 做注册,比如oncreat()方法。
RxBus.getInstance().toObservable(RefreshLogin.class)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(event -> {
if (event.message != null ) {
//在这里进行操作
}
}
});
- 发送
//这里不需要注册,直接调用即可,另外,在工程里我是做了manager,管理这个发送
RxBus.getInstance().post(new RefreshLogin(message));
到现在,你就可以把引入的eventbus给删除了