RxBus

之前项目用的是EventBus,最近项目开始用RxJava去替换些复杂的逻辑操作,所以可以用RxBus来替代EventBus,这样可以省去库的依赖,减小apk的大小。

RxJava

此篇需要有RxJava的基础,关于RxJava,可以看扔物线的给 Android 开发者的 RxJava 详解.

RxBus

若对于RxJava有些了解,其RxBus的简单代码如下:

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
public class RxBus {
private volatile static RxBus instance;
private final Subject bus;
public RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
public static RxBus getInstance() {
if (null == instance) {
synchronized (RxBus.class) {
if (null == instance) {
instance = new RxBus();
}
}
}
return instance;
}
//提供一个事件传递
public void post(Object o) {
bus.onNext(o);
}
// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable(Class<T> eventType) {
return bus.ofType(eventType);
}
}

使用方式

发送事件的代码:

1
RxBus.getInstance().post(new Event(0));

Event是要发送的事件:

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
public class Event {
private String message;
private int flag;
public Event(String message) {
this.message = message;
}
public Event(int flag) {
this.flag = flag;
}
public Event(String message, int flag) {
this.message = message;
this.flag = flag;
}
public String getMessage() {
return message;
}
public int getFlag() {
return flag;
}
}

接收事件的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// rxSubscription是一个Subscription的全局变量,这段代码可以在onCreate/onStart等生命周期内
rxSubscription = RxBus.getDefault().toObserverable(Event.class)
.subscribe(new Action1<UserEvent>() {
@Override
public void call(Event event) {
String message = event.getMessage();
...
}
},
new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
// TODO: 处理异常
}
});

最后

一定要记得在生命周期结束的地方取消订阅事件,防止RxJava可能会引起的内存泄漏问题。

1
2
3
4
5
6
7
@Override
protected void onDestroy() {
super.onDestroy();
if(!rxSubscription.isUnsubscribed()) {
rxSubscription.unsubscribe();
}
}

坚持原创技术分享,您的支持将鼓励我继续创作!