最近在学习Rxjava相关的知识,发现我们完全可以用Rxjava里面的知识来代替以前项目中使用的EventBus.
在介绍实现前,先说说几点可能会有疑惑的问题:
首先,明确一下RxBus的概念
RxBus 名字看起来像一个库,但它并不是一个库,而是一种模式,它的思想是使用 RxJava 来实现了 EventBus ,而让你不再需要使用OTTO或者 GreenRobot 的EventBus。
其次,为什么要使用RxBus来代替EventBus
我之所以想用RxBus来代替EventBus,一是为了自己更加熟悉Rxjava的相关用法,二是为了减少程序引用的第三方库(既然都用了Rxjava 没必要再去引入EventBus)。
当然,如果对Rxjava没有一点了解,或者说只是想简单的使用EventBus的功能,建议还是使用Otto或者GreenRobot的EventBus,这二者都可以通过注解非常简单的使用。
下面是正文:
public class RxBus {
private static RxBus instance;
private Vector<Subject> subjectList = new Vector<>();
private RxBus() {
}
public static synchronized RxBus getInstance() {
if (null == instance) {
instance = new RxBus();
}
return instance;
}
public synchronized <T> Observable<T> register(@NonNull Object object) {
Subject<T, T> subject = PublishSubject.create();
subjectList.add(subject);
return subject;
}
public synchronized void unregister(Object object) {
subjectList.remove(object);
}
public void post(@NonNull Object content) {
synchronized (this) {
for (Subject subject : subjectList) {
if (subject != null) {
subject.onNext(content);
}
}
}
}
}
Rxbus代码如上,使用方式和EventBus一样,在合适的地方(比如oncreate 或者 onResume)注册,和取消注册(如onPause和onDestroy),在初始化同时,我们可以指定接收后所运行的线程等其他操作
Observable<UserBean> observable = RxBus.getInstance().register(this); observable.observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<UserBean>() { @Override public void call(UserBean userBean) { Log.d("Test", "received :" + userBean.toString()); } });
RxBus.getInstance().unregister(this);
发送事件的方式:
RxBus.getInstance().post(new UserBean("rxbus", 99));
当然我们还可以在这个的基础上加上注解的方式 来让实现更方便,这个就留着后面再处理了!