RxAndroid 应用(四)(简易天气App之RxBus)

       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 publishSubject =  PublishSubject.create();
    private final Subject mBus = new SerializedSubject(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 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() {
            @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

你可能感兴趣的:(Android)