小白装逼:使用rxjava代替eventBus

接着之前说的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 mBus;

    private final Map, 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  Observable toObservable(Class eventType) {
        return mBus.ofType(eventType);
    }
    
    /**
     * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
     */
    public  Observable toObservableSticky(final Class eventType) {
        synchronized (mStickyEventMap) {
            Observable 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 getStickyEvent(Class eventType) {
        synchronized (mStickyEventMap) {
            return eventType.cast(mStickyEventMap.get(eventType));
        }
    }

    /**
     * 移除指定eventType的Sticky事件
     */
    public  T removeStickyEvent(Class 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() {
                                        @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直接实现一个订阅者订阅多个事件…

###以上内容,纯属个人理解,如有错误,请指出纠正,若有雷同,你肯定在做梦~~~~

你可能感兴趣的:(android学习笔记)