接着之前说的rxjava代替eventBus的,现在大部分的项目都有使用retrofit+rxjava,所以为了方便,直接使用rxjava来代替eventbus事件总线.虽然这样有些不足的地方,但也是一个不错的方案…
#导入包
compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'或者
compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1'#配置
public class RxBus { private static volatile RxBus mDefaultInstance;//单例 private final Subject<Object, Object> mBus; private final Map<Class<?>, Object> mStickyEventMap;//这里是为了给每一类事件做标记 public RxBus() { mBus = new SerializedSubject<>(PublishSubject.create());//使用publishSubject(可以先订阅后出发其onNext等方法的subJect)创建一个线程安全的SerializedSubject mStickyEventMap = new ConcurrentHashMap<>();//这里使用线程安全的map } public static RxBus getDefault() {//获取单例 if (mDefaultInstance == null) { synchronized (RxBus.class) { if (mDefaultInstance == null) { mDefaultInstance = new RxBus(); } } } return mDefaultInstance; } /** * 发送事件 */ public void post(Object event) { mBus.onNext(event); } /** * 发送一个新Sticky事件 */ public void postSticky(Object event) { synchronized (mStickyEventMap) { mStickyEventMap.put(event.getClass(), event); } post(event); } /** * 判断是否有订阅者 */ public boolean hasObservers() { return mBus.hasObservers(); } /** * 重新设置订阅者 */ public void reset() { mDefaultInstance = null; } /** * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 */ public <T> Observable<T> toObservable(Class<T> eventType) { return mBus.ofType(eventType); } /** * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 */ public <T> Observable<T> toObservableSticky(final Class<T> eventType) { synchronized (mStickyEventMap) { Observable<T> observable = mBus.ofType(eventType);//获取发布者(被观察者)的Observable final Object event = mStickyEventMap.get(eventType);//获取存储的eventType事件类型 if (event != null) { return observable.mergeWith(Observable.just(eventType.cast(event))); //mergeWith是结合俩个observable,just是将内容原样发射,cast为强制转换为当前类型; // 综合为:获取原事件总线的事件并将新的与其结合后一同放入事件总线 } else { return observable; } } } /** * 根据eventType获取Sticky事件 */ public <T> T getStickyEvent(Class<T> eventType) { synchronized (mStickyEventMap) { return eventType.cast(mStickyEventMap.get(eventType)); } } /** * 移除指定eventType的Sticky事件 */ public <T> T removeStickyEvent(Class<T> eventType) { synchronized (mStickyEventMap) { return eventType.cast(mStickyEventMap.remove(eventType)); } } /** * 移除所有的Sticky事件 */ public void removeAllStickyEvents() { synchronized (mStickyEventMap) { mStickyEventMap.clear(); } } }建立一个统一事件类型类(一个用于存储传递数据的类,这里只存储一个字符串,可以传递更多信息)
public class EventSticky { public String event; public EventSticky(String event) { this.event = event; } @Override public String toString() { return "EventSticky{" + "event='" + event + '\'' + '}'; } }#rxjava的使用
###订阅事件
private Subscription mRxSubSticky;//这里使用Subscription 来管理订阅者 private void subscribeEventSticky() { if (mRxSubSticky != null && !mRxSubSticky.isUnsubscribed()) { RxSubscriptions.remove(mRxSubSticky);//这里为解除订阅者 } else { EventSticky s = RxBus.getDefault().getStickyEvent(EventSticky.class);//这里是测试获取到的事件 Log.i("FFF", "获取到StickyEvent--->" + s); mRxSubSticky = RxBus.getDefault().toObservableSticky(EventSticky.class) .subscribe(new RxBusSubscriber<EventSticky>() { @Override protected void onEvent(EventSticky eventSticky) { Log.e("FFF", "onNext--Sticky-->" + eventSticky.event); if("img_head".equals(eventSticky.event)){ Log.w("---rxtest---",eventSticky.event); } if("getNewOrder".equals(eventSticky.event)){ Log.i("---接收发来的事件---",eventSticky.event); } if ("doneOrder".equals(eventSticky.event)){ Log.i("---接收发来的事件---",eventSticky.event); } if ("order".equals(eventSticky.event)){ Log.i("---接收发来的事件---",eventSticky.event); } if("img_head".equals(eventSticky.event)){ } } }); RxSubscriptions.add(mRxSubSticky); } }###发起事件
RxBus.getDefault().postSticky(new EventSticky("getNewOrder"));###解除订阅
RxSubscriptions.remove(mRxSubSticky); RxBus.getDefault().removeAllStickyEvents();#结尾吐槽
以上是本人项目中接触到的rxjava代替eventBus的方法,就是在订阅事件的时候,处理的多一些,其他的还是很好用的.和eventBus比较的话,rxjava适用于一个订阅者订阅一个事件,因为如果要订阅多个事件的话就要注册多次,而eventBus直接实现一个订阅者订阅多个事件…
###以上内容,纯属个人理解,如有错误,请指出纠正,若有雷同,你肯定在做梦~~~~