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