RxJava和RxBus代替EventBus

最近在学习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));

当然我们还可以在这个的基础上加上注解的方式 来让实现更方便,这个就留着后面再处理了!
 


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值