package com.github.bigexcalibur.herovideo.rxbus; import rx.Observable; import rx.subjects.PublishSubject; import rx.subjects.SerializedSubject; import rx.subjects.Subject; /** * RxBus * Subject同时充当了Observer和Observable的角色,Subject是非线程安全的, * 要避免该问题,需要将 Subject转换为一个 SerializedSubject , * 上述RxBus类中把线程非安全的PublishSubject包装成线程安全的Subject。 * PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者 * ofType操作符只发射指定类型的数据,其内部就是filter+cast */ public class RxBus { private static volatile RxBus mInstance; private final Subject<Object,Object> bus; private RxBus() { bus = new SerializedSubject<>(PublishSubject.create()); } /** * 单例模式RxBus2 * * @return */ public static RxBus getInstance() { RxBus rxBus = mInstance; if (mInstance == null) { synchronized (RxBus.class) { rxBus = mInstance; if (mInstance == null) { rxBus = new RxBus(); mInstance = rxBus; } } } return rxBus; } /** * 发送消息 * * @param object */ public void post(Object object) { bus.onNext(object); } /** * 接收消息 * * @param eventType * @param <T> * @return */ public <T> Observable<T> toObserverable(Class<T> eventType) { return bus.ofType(eventType); } }