RxJava学习(三)concat和firstElement操作符的应用

concat操作符:串行合并多个观察者中的事件。
firstElement操作符:按照顺序依次遍历被观察者中事件,事件不为空,则停止遍历。

该例子为:我们平时开发中的数据缓存功能。
1.首先获取内存缓存中的数据,如果数据为空,获取硬盘缓存中的数据。
2.获取硬盘缓存中的数据,如果硬盘缓存中数据为空,则从网络中获取数据。
3.获取网络中的数据。
获取到数据之后发送事件。


private String memoryData;//内存缓存的数据
    private String diskData = "缓存中的数据";//磁盘缓存的数据
    private String netWorkData="网络中的数据";//网络获取的数据
    /**
     * 分别依次遍历,如果前面的数据为空,则往后面获取数据
     * 即1.先获取内存缓存的数据,如果为空
     * 2.获取磁盘缓存中的数据,如果为空
     * 3.获取网络的数据
     */
    private void getData(){
        //三个数据源封装成了三个被观察者对象
        Observable observable1 = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                if(memoryData==null){
                    e.onComplete();
                }
                else{
                    e.onNext(memoryData);
                }
            }
        });
        Observable  observable2= Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter e) throws Exception {
                if(diskData==null){
                    e.onComplete();
                }
                else{
                    e.onNext(diskData);
                }
            }
        });
        Observable  observable3 = Observable.just(netWorkData);
        //对三个被观察者串行合并成一个队列
        Observable.concat(observable1,observable2,observable3)
                .firstElement()//从串行队列依次按顺序遍历事件,取出数据,如果取到,则发送事件,停止遍历。
                .subscribe(new Consumer() {
                    @Override
                    public void accept(String o) throws Exception {
                        Log.e(TAG, "获取到的数据: "+ o);
                    }
                });
    }

输出结果:

RxJava学习(三)concat和firstElement操作符的应用_第1张图片
image.png

你可能感兴趣的:(RxJava学习(三)concat和firstElement操作符的应用)