之前事件总线都是用EventBus或者otto来做,现在RxJava越来越火了,用RxJava实现事件总线也是很方便的.不多说直接看代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34/**
* RxBus
*/
public class RxBus {
private static volatile RxBus defaultInstance;
// 主题
private final Subject bus;
// PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
public RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
// 单例RxBus
public static RxBus getDefault() {
RxBus rxBus = defaultInstance;
if (defaultInstance == null) {
synchronized (RxBus.class) {
rxBus = defaultInstance;
if (defaultInstance == null) {
rxBus = new RxBus();
defaultInstance = rxBus;
}
}
}
return rxBus;
}
// 提供了一个新的事件
public void post (Object o) {
bus.onNext(o);
}
// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable (Class<T> eventType) {
return bus.ofType(eventType);
}
}
使用方法:
1 | // rxSubscription是一个Subscription的全局变量,这段代码可以在onCreate/onStart等生命周期内 |
上面RxBus实现代码引用自:
用RxJava实现事件总线(Event Bus)](http://www.jianshu.com/p/ca090f6e2fe2/) 更详细信息可以点击查看
发现上面RxJava实现的RxBus确实很方便,代码也挺简洁.但是有个问题是我在使用EventBus以及otto的时候一直存在的疑问,就是当发送相同类型的事件或者消息的时候接收的时候怎么去区分?
基于这个问题我对上面的RxBus进行了改造.代码如下:
1 | package com.cm.rxbus; |
Message代码:
1 | package com.cm.rxbus; |
RxBus里添加了一个post(int code, Object o)
方法,里面调用了bus.onNext(new Message(code,o));
将code跟object用Message类进行了封装.
toObservable(final int code, final Class<T> eventType)
对传入code的事件进行分发,先调用bus.ofType(Message.class)
返回Message类的观察者,然后通过filter
操作符返回Message里code跟Object类型跟传入的类型都匹配的观察者,再通过map
操作符返回Message里的object对象,最后通过cast
转化为特定类的观察者.
使用方法:
1 | //注册观察者 |
这样如果有多个消息是相同类型的话就可以通过不同的code进行区分了.
最后,一定要记得在生命周期结束的地方取消订阅事件,防止RxJava可能会引起的内存泄漏问题。
1 |
|