欢迎转载,转载请标明出处:

http://blog.csdn.net/johnny901114/article/details/51533282

本文出自:【余志强的博客】

concatMap操作符的作用

concatMap操作符和flatMap操作符非常类似。如果对 flatMap操作符 不是很了解可以点击链接去看看我的上一篇博文。下面是concatMap操作符的流程图:

concatMap和flatMap最大的区别是concatMap发射的数据集是有序的,flatMap发射的数据集是无序的。

concatMap操作符的用法示例

通过上一篇对flatMap的介绍,我们的例子程序输出的结果是无序的。现在把代码中的flatMap换成concatMap:

Observable.from(Arrays.asList(
            "http://www.baidu.com/",
            "http://www.google.com/",
            "https://www.bing.com/"))
            .concatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(String s) {
                        return createIpObservableMultiThread(s);
                    }
                })
            .observeOn(AndroidSchedulers.mainThread());

    // 获取ip
    private synchronized Observable<String> createIpObservableMultiThread(final String url) {
        return Observable
                .create(new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        try {
                            String ip = getIPByUrl(url);
                            printLog(tvLogs, "Emit Data -> ", url + "->" + ip);
                            subscriber.onNext(ip);
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                            //subscriber.onError(e);
                            subscriber.onNext(null);
                        } catch (UnknownHostException e) {
                            e.printStackTrace();
                            //subscriber.onError(e);
                            subscriber.onNext(null);
                        }
                        subscriber.onCompleted();
                    }
                })
                .subscribeOn(Schedulers.io());
    }

输出结果:

Emit Data -> 'http://www.baidu.com/->115.239.211.112' , Main Thread:false, Thread Name:RxCachedThreadScheduler-1
Consume Data <- '115.239.211.112' , Main Thread:true, Thread Name:main
Emit Data -> 'http://www.google.com/->216.58.221.132'Main Thread:false, Thread Name:RxCachedThreadScheduler-3
Emit Data -> 'https://www.bing.com/->202.89.233.104' Main Thread:false, Thread Name:RxCachedThreadScheduler-2
Consume Data <- '216.58.221.132' Main Thread:true, Thread Name:main
Consume Data <- '202.89.233.104' Main Thread:true, Thread Name:main 

输出的结果始终都是baidu/google/bing, 使用的线程都是不同的线程。这也就解决了上篇博客提出的问题:既要是多个线程完成任务,又要保持任务的顺序

但是出现了一个奇怪的问题:上篇博客我们使用flatMap在多个线程完成任务,有时候顺序是乱的。但是concatMap一开始也是使用一个线程来完成任务,只有先调用flatMap多线程完成任务,然后再调用concatMap才会有多线程。

实验结果表明:如果RxJava有了多个线程,concatMap才会使用多个线程,如果Rxjava里只有一个缓存的线程,concatMap只是用一个线程来执行任务,尽管加上了.subscribeOn(Schedulers.io())代码。然而如果是flatMap加上.subscribeOn(Schedulers.io())代码,每次调用都是多个线程的。这也是flatMap和concatMap的又一个区别。

具体的细节 可以查看代码:github地址

RxJava(四) concatMap操作符用法详解的更多相关文章

  1. RxJava(三) flatMap操作符用法详解

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51532776 本文出自:[余志强的博客] flatMap操作符的作用 ...

  2. RxJava(二) map操作符用法详解

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51531348 本文出自:[余志强的博客] 1 map操作符的作用 R ...

  3. oracle正则表达式regexp_like的用法详解

    oracle正则表达式regexp_like的用法详解 /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与IN ...

  4. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  5. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  6. JS逗号运算符的用法详解

    逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...

  7. UIWebView用法详解及代码分享

    今天我们来详细UIWebView用法.UIWebView是iOS内置的浏览器控件,可以浏览网页.打开文档等 能够加载html/htm.pdf.docx.txt等格式的文件. 用UIWebView我们就 ...

  8. linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)

    linux useradd(adduser)命令参数及用法详解(linux创建新用户命令) useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号 ...

  9. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

随机推荐

  1. JavaScript之Promise对象

    含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象. ...

  2. mysql事务,视图,权限管理,索引,存储引擎(胖胖老师)

    1: 视图什么是视图    视图是一个虚拟表, 它的内容来源于查询的实表, 本身没有真正的数据;视图的作用    对于复杂的查询时,每次查询时都需要编写一些重复的查询代码让编写sql的效率低下, 为了 ...

  3. [AtCoder agc021D]Reversed LCS

    Description 题库链接 在改变原串 \(S\) 最多 \(K\) 个字母的前提下,使得 \(S\) 和 \(S\) 的反串的 \(LCS\) 尽量长,问最长长度. \(1\leq K\leq ...

  4. [Tjoi2013]最长上升子序列

    Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input 第一行一 ...

  5. 【LSGDOJ1836】: 量化交易 贪心

    题目描述 applepi 训练了一个可以自动在股票市场进行量化交易的模型.通常来说,applepi 写出的模型,你懂得,就好比一架印钞机.不过为了谨慎起见,applepi还是想先检查一下模型的效果.a ...

  6. ●BZOJ 3996 [TJOI2015]线性代数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3996 题解: 好题啊.(不太熟悉矩阵相关,所以按某些博主的模型转换来理解的)首先,那个式子可 ...

  7. hdu 5637 BestCoder Round #74 (div.2)

    Transform  Accepts: 7  Submissions: 49  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: 131072 ...

  8. 习题9-5 UVA 242

    Stamps and Enovelope Size 题意: 给你最多贴S张邮票.有N个邮票集合,每个集合有不同的面值.问哪个集合的最大连续邮资最大,输出最大连续邮资和集合元素. 如果不止一个集合结果相 ...

  9. bzoj1010[HNOI2008]玩具装箱toy 斜率优化dp

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 11893  Solved: 5061[Submit][S ...

  10. [51nod1238]最小公倍数之和V3

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...