public class RxBus { private static volatile RxBus defaultInstance; private final Subject<Object, Object> bus; // PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者 public RxBus() { bus = new SerializedSubject<>(PublishSubject.create()); } // 单例RxBus public static RxBus getDefault() { if (defaultInstance == null) { synchronized (RxBus.class) { if (defaultInstance == null) { defaultInstance = new RxBus(); } } } return defaultInstance ; } // 发送一个新的事件 public void post (Object o) { bus.onNext(o); } // 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 public <T> Observable<T> toObservable (Class<T> eventType) { return bus.ofType(eventType); // 这里感谢小鄧子的提醒: ofType = filter + cast // return bus.filter(new Func1<Object, Boolean>() { // @Override // public Boolean call(Object o) { // return eventType.isInstance(o); // } // }) .cast(eventType); } }
使用RxBus post数据
RxBus.getDefault().post(new UserEvent(1, Constants.RENOVATE));//post方法里面的参数是自己自定义的even
接收RxBus post出来的数据,post出来的数据哪里都可以接收,但是接收的时候首先的保证Subscription已经注册,
如果没有注册,则接收不到注册之前post出来的数据。
使用RxBus接收post出来的数据
printSubscribe = RxBus.getDefault().toObservable(StateEvent.class).subscribe(new Action1<StateEvent>() { @Override public void call(StateEvent printEvent) { if (printEvent.getId() == 1) { receiptConnected = printEvent.isConnected(); if (receiptConnected) { imgReceiptState.setImageResource(R.drawable.print_receipt_state_open); } else { imgReceiptState.setImageResource(R.drawable.print_receipt_state_close); } } } });根据自定义的event里面的字段,得到RxBus post出来的数据,在进行ui的更新操作