zoukankan      html  css  js  c++  java
  • RxJava的concat操作符

    更多文章请点击http://77blogs.com/?p=170

    转载请标明出处:https://www.cnblogs.com/tangZH/p/12088332.htmlhttp://77blogs.com/?p=170

    使用场景一:

    现在要执行两个任务:

    1、输出字符串0

    2、输出字符串1

    我们就可以使用concat来实现多个数据源。

    1、输出字符串0的数据源:

            Observable observableLocal = Observable.create(new ObservableOnSubscribe() {
                @Override
                public void subscribe(ObservableEmitter emitter) throws Exception {
                    emitter.onNext("0");
                    emitter.onComplete();
                }
            }).subscribeOn(Schedulers.io());

    2、输出字符串1的数据源:

            Observable observableNet = Observable.create(new ObservableOnSubscribe() {
                @Override
                public void subscribe(ObservableEmitter emitter) throws Exception {
                    emitter.onNext("1");
                    emitter.onComplete();
                }
            }).subscribeOn(Schedulers.io());

    3、接收多个数据源:

            Observable.concat(observableLocal, observableNet)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer() {
                        @Override
                        public void accept(Object o) throws Exception {
                            Log.d(TAG, (String) o);
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(Throwable throwable) throws Exception {
                            Log.d(TAG, throwable.getMessage());
                        }
                    });
        }

    可以看到Log:

    12-23 20:23:48.771 23643-23643/com.status.rxjavasample D/RxJavaHelper: 0
    12-23 20:23:48.771 23643-23643/com.status.rxjavasample D/RxJavaHelper: 1

    两个字符串都输出了,而且是有序的。

    使用场景二、

    获取数据,如果从本地缓存中获取得到数据,那么便不从网络获取,否则从网络获取。

    我们将上面的1,2两个步骤分别当成从本地缓存获取数据和从网络缓存中获取数据,那么我们需要改变上面的3步骤。

            Observable.concat(observableLocal, observableNet)
                    .firstElement()
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Consumer() {
                        @Override
                        public void accept(Object o) throws Exception {
                            Log.d(TAG, (String) o);
                        }
                    }, new Consumer<Throwable>() {
                        @Override
                        public void accept(Throwable throwable) throws Exception {
                            Log.d(TAG, throwable.getMessage());
                        }
                    });
        }

    唯一不同的是加上.firstElement()。

    输出的log为:

    12-23 20:29:11.731 24458-24458/com.status.rxjavasample D/RxJavaHelper: 0

    firstElement操作符:按照顺序依次遍历被观察者中事件,事件不为空,则停止遍历。

  • 相关阅读:
    Jmeter非GUI模式运行脚本
    vmware下 linux如何扩展磁盘空间
    (完美解决方案)Windows Server 2012 R2报错:无法启动此程序,因为计算机中丢失 apimswincrtstdiol110.dll 解决
    Python程序执行性能优化心得
    jmeter中TPS和吞吐量区别与联系
    Python多进程之Pool进程池浅析
    为什么Jmeter 运行时到达持续时间不停止?
    一些在线实用小工具
    笔记20171225
    JMeter 安装 linux平台
  • 原文地址:https://www.cnblogs.com/tangZH/p/12088332.html
Copyright © 2011-2022 走看看