flatMap,zip,Merge区别

flatMap

嵌套请求->多用于一个接口的请求依赖另一个API请求返回的数据

        //例如:先登录获取token后,再去请求另一个接口Observable<AuthModel> login = EasyHttp.post(ComParamContact.Login.PATH).params(ComParamContact.Login.ACCOUNT, "18688994275").params(ComParamContact.Login.PASSWORD, MD5.encrypt4login("123456", AppConstant.APP_SECRET)).sign(true).timeStamp(true).execute(AuthModel.class);login.flatMap(new Function<AuthModel, ObservableSource<SkinTestResult>>() {@Overridepublic ObservableSource<SkinTestResult> apply(@NonNull AuthModel authModel) throws Exception {return EasyHttp.get("/v1/app/chairdressing/skinAnalyzePower/skinTestResult").params("accessToken", authModel.getAccessToken())//这个地方只是举例,并不一定是需要accessToken.timeStamp(true).execute(SkinTestResult.class);}}).subscribe(new ProgressSubscriber<SkinTestResult>(this, mProgressDialog) {@Overridepublic void onError(ApiException e) {super.onError(e);showToast(e.getMessage());}@Overridepublic void onNext(SkinTestResult skinTestResult) {showToast(skinTestResult.toString());}});

Zip

使用zip操作符合并等待多个网络请求完成后,再刷新界面

      //例如下面:数据来自3个不同的接口Observable<ResultBean> mobileObservable = EasyHttp.get("http://apis.juhe.cn/mobile/get").params("phone", "18688994275").params("dtype", "json").params("key", "5682c1f44a7f486e40f9720d6c97ffe4").execute(new CallClazzProxy<TestApiResult1<ResultBean>, ResultBean>(ResultBean.class) {});Observable<Content> searchObservable = EasyHttp.get("/ajax.php").baseUrl("http://fy.iciba.com").params("a", "fy").params("f", "auto").params("t", "auto").params("w", "hello world")//采用代理.execute(new CallClazzProxy<TestApiResult6<Content>, Content>(Content.class) {});Observable<List<SectionItem>> listObservable = EasyHttp.get("http://news-at.zhihu.com/api/3/sections").execute(new CallClazzProxy<TestApiResult5<List<SectionItem>>, List<SectionItem>>(new TypeToken<List<SectionItem>>() {}.getType()) {});//new Function3最后一个参数这里用的是List<Object>,表示将3个返回的结果,放在同一个集合最终一次性返回,你也可以指定返回其它你需要的数据类型并不一定是List<Object>//假如这三个接口返回的都是TestBean,那么就可以直接用具体的List<TestBean>,不需要用List<Object>Observable.zip(mobileObservable, searchObservable, listObservable, new Function3<ResultBean, Content, List<SectionItem>, List<Object>>() {@Overridepublic List<Object> apply(@NonNull ResultBean resultbean, @NonNull Content content, @NonNull List<SectionItem> sectionItems) throws Exception {//将接收到的3个数据先暂存起来,一次性发给订阅者List list = new ArrayList();list.add(resultbean);list.add(content);list.add(sectionItems);return list;}}).subscribe(new BaseSubscriber<List<Object>>() {@Overridepublic void onError(ApiException e) {showToast(e.getMessage());}@Overridepublic void onNext(@NonNull List<Object> objects) {showToast(objects.toString());}});

Merge

//Merge其实只是将多个Obsevables的输出序列变为一个,方便订阅者统一处理,对于订阅者来说就仿佛只订阅了一个观察者一样。

      //拼接两个/多个Observable的输出,不保证顺序,按照事件产生的顺序发送给订阅者//这个请求故意延时5秒再发送-最后测试结果发现,并不是searchObservable等待mobileObservable5秒后再发送Observable<ResultBean> mobileObservable = Observable.timer(5, TimeUnit.SECONDS).flatMap(new Function<Long, ObservableSource<ResultBean>>() {@Overridepublic ObservableSource<ResultBean> apply(@NonNull Long aLong) throws Exception {return EasyHttp.get("http://apis.juhe.cn/mobile/get").params("phone", "18688994275").params("dtype", "json").params("key", "5682c1f44a7f486e40f9720d6c97ffe4").execute(new CallClazzProxy<TestApiResult1<ResultBean>, ResultBean>(ResultBean.class) {});}});Observable<Content> searchObservable = EasyHttp.get("/ajax.php").baseUrl("http://fy.iciba.com").params("a", "fy").params("f", "auto").params("t", "auto").params("w", "hello world")//采用代理.execute(new CallClazzProxy<TestApiResult6<Content>, Content>(Content.class) {});//merge和mergeDelayError都是合并,但是需要注意二者区别。//merge:合并的请求,如果有一个接口报错了,就立马报错,会终止整个流,另外的接口也不会请求。//mergeDelayError:合并的请求,如果有一个接口报错了,会延迟错误处理,后面的接口会继续执行没有被中断。//使用时根据需要选用merge/mergeDelayError//Observable.merge(searchObservable,mobileObservable).subscribe(new BaseSubscriber<Object>() {Observable.mergeDelayError(searchObservable, mobileObservable).subscribe(new BaseSubscriber<Object>() {@Overridepublic void onError(ApiException e) {showToast(e.getMessage());}@Overridepublic void onNext(@NonNull Object object) {//为什么用Object接收,因为两个接口请求返回的数据类型不是一样的,如果是一样的就用具体的对象接收就可以了,// 不再需要instanceof麻烦的判断if (object instanceof ResultBean) {//mobileObservable 返回的结果//处理  ResultBean逻辑} else if (object instanceof Content) {//处理  Content逻辑}showToast(object.toString());}});

flatMap,zip,Merge区别相关推荐

  1. linux zip和tar的区别,Linux入门:tar、gzip、bzip2以及zip的区别

    Linux入门:tar.gzip.bzip2以及zip的区别 tar命令 gzip以及bzip2命令 zip命令 区别 正文处理命令 tar命令 1.归档(archiving)就是将许多文件(或目录) ...

  2. Linux压缩命令gzip、tar、zip的区别和用法

    Linux压缩命令gzip.tar.zip的区别和用法 Linux系统中常用的压缩命令有gzip.tar.zip等. gzip命令是一个压缩文件的工具,常用参数有: -c : 把压缩后的文件输出到标准 ...

  3. 压缩文件注意(rar软件和zip软件区别)

    区别一.zip的安装比较大,并仅仅有英文版+汉化包 rar有官方的简体中文版,并且安装很小,安装之后winrar才5.746M 区别二.winrar的压缩率较高,而zip的压缩率更低 .winrar压 ...

  4. Linux入门:tar、gzip、bzip2以及zip的区别

    Linux入门:tar.gzip.bzip2以及zip的区别 tar命令 gzip以及bzip2命令 zip命令 区别 正文处理命令 tar命令 1.归档(archiving)就是将许多文件(或目录) ...

  5. zip()和zip(*)的区别与使用

    zip()和zip(*)的区别与使用 简介 zip(iteration) 传入一个参数时 传入两个参数时 zip(a,b) 使用 参考链接 简介 zip(iteration) 传入一个参数时 zip( ...

  6. Python数据处理中 pd.concat 与 pd.merge 区别

    背景 数据的合并与关联是数据处理过程中经常遇到的问题,在SQL.HQL中大家可能都有用到 join.uion all 等 ,在 Pandas 中也有同样的功能,来满足数据处理需求,个人感觉Pandas ...

  7. git clone和直接下载zip的区别

    clone包含.git zip不包含 git clone + 复制下来的链接 git clone + 复制下来的URL 下载出来的文件是带有.git文件夹的 而通过直接下载ZIP包的话他是没有自带.g ...

  8. Binaries和Source、tgz和zip的区别

    在下载页面会有2种下载分类,一个是Binaries,一个是source,一般开放原代码软件都会有两个版本发布: Source Distribution 和 Binary Distribution ,二 ...

  9. Linux中 gzip zip bzip2 区别

    **功能:**压缩 区别: *gzip:*1.自动添加压缩后缀".gz",源文件默认消失,如需保留源文件,需使用参数"c",并手动添加压缩后缀.2.不支持目录压 ...

最新文章

  1. 启动mysqld报 mysql the server quit without updating pid file
  2. luvit 被忽视的lua 高性能框架(仿nodejs)
  3. .net autofac Web Forms
  4. vue填坑指南之模板的使用
  5. r语言和metawin_Windows下使用Rtools编译R语言包
  6. 【C++提高班】c++数组遍历比较相邻的数值
  7. ORACLE使用WITH AS和HINT MATERIALIZE优化SQL解决FILTER效率低下
  8. Jsoup解析body片段
  9. CentOS 最小化安装后安装桌面
  10. 吴恩达深度学习的实用层面编程作业:初始化Initialization
  11. django高级之点赞、文章评论及上传文件
  12. 关于JSP post请求乱码的问题
  13. 现代控制理论(4)——李雅普诺夫稳定性理论
  14. bat 脚本(批处理)操作注册表
  15. 用正则表达式验证联系电话(及区号)
  16. java -jar .jar_Java_JAR命令JAR包闲谈;
  17. 使用uniapp做微信小程序,在小程序编辑器运行时编译报错:appid不合法,导致启用不了。
  18. python继续教育_济宁市专业技术人员继续教育自动化观看课程工具
  19. 计算机专业研究生应该怎么读
  20. GEE基础-实现NDVI年最大值合成

热门文章

  1. 【转载】eMule电驴使用从入门到精通(4)-------电驴宗旨:我为人人,人人为我
  2. HDUOJ1865 1string
  3. android 命名空间的使用
  4. PackageManagerService安装应用流程
  5. python使用selenium + PhantomJs搭建的简单漫画爬虫工具
  6. Unity中导出apk文件
  7. 使用Spreadsheet操作Excel
  8. Hotkeycontrol录制宏
  9. 没有 XXX 的手册页条目
  10. FMM 大战 LMM - SOFR 企稳 Part I