RxAndroid 应用(一)(简易天气App)
RxAndroid 应用(二)(简易天气App)
RxAndroid 应用(三)(简易天气App之Observable内存泄露)
RxAndroid 应用(四)(简易天气App之RxBus)
如果还不知道什么是RxBus,可以google下Otto或者EventBus看看。
介绍RxBus前先介绍下什么是Subject,直接看看我前面的描述:
subject 是一个神奇的对象,它可以是一个Observable同时也可以是一个Observer:它作为连接这两个世界的一座桥梁。
一个主题可以订阅一个Observable,就像一个观察者,并且它可以发射新的数据,或者传递它接受到的数据,就像一个Observable。很明显,
作为一个Observable,观察者们或者其它主题都可以订阅它。
如果你把 Subject 当作一个 Subscriber 使用,注意不要从多个线程中调用它的onNext方法(包括其它的on系列方法),这可能导致同时(非顺序)调用,这会违反Observable协议,给Subject的结果增加了不确定性。要避免此类问题,你可以将 Subject 转换为一个 SerializedSubject 。对于一系列的subject介绍及代码请移步:Subject详解。
进入今天的主题,下面是参照RxJava-Android-Sample中写的RxBus:
public class RxBus { private final PublishSubject<BusEvent> publishSubject = PublishSubject.create(); private final Subject<BusEvent, BusEvent> mBus = new SerializedSubject<BusEvent, BusEvent>(publishSubject); private static class RxBusHolder { private static final RxBus INSTANCE = new RxBus(); } private RxBus() {} public static final RxBus getInstance() { return RxBusHolder.INSTANCE; } public void send(BusEvent event) { mBus.onNext(event); } public Observable<BusEvent> toObserverable() { return mBus; } public boolean hasObservers() { return mBus.hasObservers(); } public static class BusEvent {} }
@Override public void onCreate() { super.onCreate(); mSubscriptions.add(RxBus.getInstance().toObserverable().subscribe(new Action1<RxBus.BusEvent>() { @Override public void call(RxBus.BusEvent rxBusEvent) { if (rxBusEvent instanceof RefreshEvent) { getPlaceAndWeatherData("成都"); } } })); }
@Override public void onRefresh() { RxBus rxBus = RxBus.getInstance(); if (rxBus.hasObservers()) { rxBus.send(new RefreshEvent()); } }
源码地址:https://github.com/mickyliu945/CommonProj