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 {}
}
为了模拟RxBus的使用,我这里添加一个FloatingActionButton,点击之后重新获取一次数据
@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());
}
}
So simple,这里只是为了演示功能而已,我们可以用它来替换广播等其他事件,比如其他观察者模式实现的功能。
源码地址:https://github.com/mickyliu945/CommonProj