前面说过Rxjava的功能很强大,不仅仅是实现链式的异步操作,它的功能很强大还可以通过RxBus实现EventBus的消息/事件传递功
能,我们来看看
RxBus
1 package com.example.liujian.rxjavademo; 2 3 import java.util.HashMap; 4 5 import rx.Observable; 6 import rx.Subscription; 7 import rx.android.schedulers.AndroidSchedulers; 8 import rx.functions.Action0; 9 import rx.functions.Action1; 10 import rx.schedulers.Schedulers; 11 import rx.subjects.PublishSubject; 12 import rx.subjects.SerializedSubject; 13 import rx.subscriptions.CompositeSubscription; 14 15 /** 16 * @project_Name: RxjavaDemo 17 * @package: com.example.liujian.rxjavademo 18 * @description: 使用Rxjava,RxAndroid实现RxBus 19 * @author: liujian 20 * @date: 2016/10/5 11:08 21 * @version: V1.0 22 */ 23 24 public class RxBus { 25 private static volatile RxBus mInstance; 26 //Subject继承了Observable类又实现了Observer接口, Subject可以同时担当订阅者和被订阅者的角色 27 private SerializedSubject
View Code 不多解释了,注释都写的很清楚了,我们来看一下如何使用
发送消息:
RxBus.getInstance().post("这是发送的消息");
处理消息:
public void doSubscribe(){ Subscription subscription = RxBus.getInstance().doSubscribe(String.class, new Action1 () { @Override public void call(String s) { Toast.makeText(MainActivity.this,s, Toast.LENGTH_SHORT).show(); } }); RxBus.getInstance().addSubscription(this,subscription); }
或者
public void doSubscribe(){ Subscription subscribe = RxBus.getInstance().toObservable(String.class) .filter(new Func1 () { @Override public Boolean call(String s) { return true; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1 () { @Override public void call(String s) { Log.i(TAG, "call: " + s); } }); RxBus.getInstance().addSubscription(this,subscribe); }
取消订阅:
@Overrideprotected void onDestroy() { //取消订阅,释放内存 RxBus.getInstance().unSubscribe(this); super.onDestroy(); }
功能的完善
当我们使用PublishSubject时,可能有些功能还不是很完善,比如我们只能先订阅事件,然后发送事件,如果反过来,先发送了事件再进
行订阅操作,比如两个Activity之间传递消息,怎么保证发送的事件不丢失呢?也就是EventBus的StickEvent功能,这个时候
PublishSubject就没有办法实现,我们可以替换为BehaviorSubject
private RxBus() { mSubject = new SerializedSubject<>(BehaviorSubject.create()); }
但是BehaviorSubject只能缓存最近一个发送给它的事件,如果我们需要缓存多个事件可以改用ReplaySubject