以前的项目中使用的是eventbus来实现事件的通知和订阅,rxjava2发布之后就使用了新的方式:Rxbus,减少添加的依赖库
源码:
引入
dependencies {
// rxjava and rxandroid
compile 'io.reactivex.rxjava2:rxjava:2.0.4'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
}
———
import android.support.annotation.NonNull;
import io.reactivex.processors.FlowableProcessor;
import io.reactivex.processors.PublishProcessor;
public class RxBus {
private final FlowableProcessor<Object> mBus;
private RxBus() {
mBus = PublishProcessor.create().toSerialized();
}
private static class Holder {
private static RxBus instance = new RxBus();
}
public static RxBus getInstance() {
return Holder.instance;
}
public void post(@NonNull Object obj) {
mBus.onNext(obj);
}
public <T> Flowable<T> register(Class<T> clz) {
return mBus.ofType(clz);
}
public void unregisterAll() {
//解除注册
mBus.onComplete();
}
public boolean hasSubscribers() {
return mBus.hasSubscribers();
}
}
在发送消息的activity中使用代码:
RxBus.getInstance().post("111");
在接收消息的activity中代码:
Flowable<String> f = RxBus.getInstance().register(String.class);
f.subscribe(new Consumer<String>() {
@Override
public void accept(String integer) throws Exception {
toast(integer);
}
});
别忘了在接收消息的地方解除注册:
@Override
public void onDestroy() {
super.onDestroy();
RxBus.getInstance().unregisterAll();
}
当然我们还可以自定义消息类,例如:
public class MsgEvent<T> {
private T data;
private String mMsg;
private int type;
private int request;
public MsgEvent(T data) {
this.data = data;
}
public MsgEvent(int request, int type, String msg) {
this.type = type;
this.mMsg = msg;
this.request = request;
}
public String getMsg(){
return mMsg;
}
public int getType(){
return type;
}
public int getRequest(){ return request; }
public T getData(){return data;}
}
在发送消息的时候,自己定义消息:
RxBus.getInstance().post(new MsgEvent(11,45,"今天天气很好"));
在接收消息的时候,选择性接收消息:
Flowable<MsgEvent> f = RxBus.getInstance().register(MsgEvent.class);
f.subscribe(new Consumer<MsgEvent>() {
@Override
public void accept(MsgEvent msg) throws Exception {
if (msg.getRequest() == 11) {
tv.setText(msg.getMsg());
}
}
});
效果图: