参考http://www.jianshu.com/p/3a3462535b4d#
import java.util.HashMap; import rx.Observable; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; import rx.subjects.PublishSubject; import rx.subjects.SerializedSubject; import rx.subscriptions.CompositeSubscription; /** * 实现RxBus代替EventBus */ public class RxBus { private static volatile RxBus mInstance; private SerializedSubject<Object, Object> mSubject; private HashMap<String, CompositeSubscription> mSubscriptionMap; private RxBus() { mSubject = new SerializedSubject<>(PublishSubject.create()); } public static RxBus getInstance() { if (mInstance == null) { synchronized (RxBus.class) { if (mInstance == null) { mInstance = new RxBus(); } } } return mInstance; } /** * 发送事件 * * @param o */ public void post(Object o) { mSubject.onNext(o); } /** * 返回指定类型的Observable实例 * * @param type * @param <T> * @return */ public <T> Observable<T> tObservable(final Class<T> type) { // return mSubject.filter(new Func1<Object, Boolean>() { // @Override // public Boolean call(Object t) { // return type.isInstance(t); // } // }).cast(type); return mSubject.ofType(type); } /** * 返回非指定类型的Observable实例(在代码中进行类型的转化) * * * @return */ public Observable<Object> tObservable() { return mSubject; } /** * 是否已有观察者订阅 * * @return */ public boolean hasObservers() { return mSubject.hasObservers(); } /** * 一个默认的订阅方法 * * @param type * @param next * @param error * @param <T> * @return */ public <T> Subscription doSubscribe(Class<T> type, Action1<T> next, Action1<Throwable> error) { return tObservable(type) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(next, error); } /** * 一个默认的订阅方法(不指定类型) *一般来说 如果一个页面有多种消息那么就可以用该方法来订阅而不是指定类型 * @param next * @param error * @return */ public Subscription doSubscribe( Action1<Object> next, Action1<Throwable> error) { return tObservable() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(next, error); } /** * 保存订阅后的subscription * * @param o * @param subscription */ public void addSubscription(Object o, Subscription subscription) { if (mSubscriptionMap == null) { mSubscriptionMap = new HashMap<>(); } String key = o.getClass().getName(); if (mSubscriptionMap.get(key) != null) { mSubscriptionMap.get(key).add(subscription); } else { CompositeSubscription compositeSubscription = new CompositeSubscription(); compositeSubscription.add(subscription); mSubscriptionMap.put(key, compositeSubscription); } } /** * 取消订阅 * * @param o */ public void unSubscribe(Object o) { if (mSubscriptionMap == null) { return; } String key = o.getClass().getName(); if (!mSubscriptionMap.containsKey(key)) { return; } if (mSubscriptionMap.get(key) != null) { mSubscriptionMap.get(key).unsubscribe(); } mSubscriptionMap.remove(key); } }
在具体的activity中进行订阅
//Rxbus订阅 private void doSubscribe() { Subscription subscription = RxBus.getInstance() .doSubscribe( new Action1<Object>() { @Override public void call(Object s) { if(s instanceof MessageNotify){ }else if(s instanceof MessageEvent){ //接收到该事件后,就改变tab的小红点 } } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { } }); RxBus.getInstance().addSubscription(this, subscription); }