在讲解RxBus之前先去解决几个问题。
1、Rxbus的概念
乍一听上去,Rxbus是一个库,但是其实他并不是一个库,而是一种思想,利用RxJava中的subject来实现了类似于
OTTO或者EventBus的功能
2、其次为啥要用Rxjava去实现呢?
现在很多项目中都在使用RxJava,利用RxJava去实现EventBus或者otto的相同功能,无疑不减少了第三方库的依赖
何乐而不为呢?
其实实现EventBus与otto相同的功能也不难,首先你需要去了解RxJava中的四种subject,下面的博客中有相关介绍
假设你之前对RxJava的语法有所了解并已经看完了它的四种subject分析,我们接下来就动手去实现我们的RxBus.
RxBus.java:
private volatile static RxBus mRxBus = null;
/**
* PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
*/
private Subject<Object, Object> mRxBusObserverable = new SerializedSubject<>(PublishSubject.create());
public static synchronized RxBus getInstance() {
if (mRxBus == null) {
synchronized (RxBus.class) {
if (mRxBus == null) {
mRxBus = new RxBus();
}
}
}
return mRxBus;
}
public void post(Object o) {
mRxBusObserverable.onNext(o);
}
//根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable(Class<T> eventType) {
return mRxBusObserverable.ofType(eventType);
}
/**
* 判断是否有订阅者
*/
public boolean hasObservers() {
return mRxBusObserverable.hasObservers();
}
使用方式:
发送事件的代码:
RxBus.getInstance().post(new Event(0));
Event是要发送的事件:
public class MessageInfo {
private String message;
private int flag;
public MessageInfo(String message) {
this.message = message;
}
public MessageInfo(int flag) {
this.flag = flag;
}
public MessageInfo(String message, int flag) {
this.message = message;
this.flag = flag;
}
public String getMessage() {
return message;
}
public int getFlag() {
return flag;
}
}
接受事件代码:
Subscription subscription = RxBus.getInstance()
.toObserverable(MessageInfo.class)
.subscribe(new Action1() {
@Override
public void call(MessageInfo event) {
String message = event.getMessage();
}
});
重点:
一定要记得在生命周期结束的地方取消订阅事件,防止RxJava可能会引起的内存泄漏问题。
@Override
protected void onDestroy() {
super.onDestroy();
if(!subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
}
918

被折叠的 条评论
为什么被折叠?



