RxBus—通过RxJava来替换EventBus

前言

RxJava有多火?看看Github上star数量就知道了,那什么是RxJava呢?

RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。

换一种说法,RxJava 是一个响应式编程框架,采用观察者设计模式。所以自然少不了 Observable 和 Subscriber 这两个东东了。

而针对Android,则有一个基于RxJava的RxAndroid

甚至Jake Wharton大神还基于RxJava写了一个针对Android平台的binding apiRxBinding

而这篇博文讲的就是基于RxJava实现的一个Event Bus->RxBus

懂得Android的开发者都知道,目前Android上最火的两个Event Bus库是Otto和Green Robot’sEventBus,两个事件总线库写的都非常不错。不过这里不是讲事件总线,而是讲如何通过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
31
32
33
34
35
36
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subjects.SerializedSubject;
import rx.subjects.Subject;

/**
* Created by HanHailong on 15/10/9.
*/

public class RxBus {

private static volatile RxBus mDefaultInstance;

private RxBus() {
}

public static RxBus getDefault() {
if (mDefaultInstance == null) {
synchronized (RxBus.class) {
if (mDefaultInstance == null) {
mDefaultInstance = new RxBus();
}
}
}
return mDefaultInstance;
}

private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());

public void send(Object o) {
_bus.onNext(o);
}

public Observable<Object> toObservable() {
return _bus;
}
}

代码非常的简单,使用呢?则更简单了,一般来讲,事件总线,包括一个发送事件和多个接收事件。

先看发送事件的代码:

1
RxBus.getDefault().send(new TapEvent());

而在你想接收事件的地方,只需要加上下面代码就可以了:

1
2
3
4
5
6
7
8
9
10
RxBus.getDefault().toObservable().subscribe(new Action1<Object>() {
@Override
public void call(Object event) {
if (event instanceof TapEvent) {
//do something
}else if(event instanceof otherEvent){
//do otherthing
}
}
});

这样,一个简单的Event Bus就实现了!如果你的项目已经开始使用RxJava,建议可以把Otto和Green Robot’sEventBus去掉了,直接使用RxBus!!

当然,不要忘了在build.gradle引入RxJava和RxAndroid:

compile 'io.reactivex:rxandroid:1.0.1'
compile 'io.reactivex:rxjava:1.0.14'