1. 需求场景

2. 功能说明

即,同时向2个数据源获取数据 -> 合并数据 -> 统一展示到客户端


3. 具体实现

此处采用Merge() & Zip()操作符进行讲解,其中:

  • Merge()例子 :实现较为简单的从(网络 + 本地)获取数据 & 统一展示
  • Zip()例子:结合RetrofitRxJava,实现较为复杂的合并2个网络请求向2个服务器获取数据 & 统一展示

3.1 采用 Merge()操作符

  • 具体实现
// 用于存放最终展示的数据String result = "数据源来自 = " ;/** 设置第1个Observable:通过网络获取数据* 此处仅作网络请求的模拟**/Observable<String> network = Observable.just("网络");/** 设置第2个Observable:通过本地文件获取数据* 此处仅作本地文件请求的模拟**/Observable<String> file = Observable.just("本地文件");/** 通过merge()合并事件 & 同时发送事件**/Observable.merge(network, file).subscribe(new Observer<String>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(String value) {Log.d(TAG, "数据源有: "+ value  );result += value + "+";}@Overridepublic void onError(Throwable e) {Log.d(TAG, "对Error事件作出响应");}// 接收合并事件后,统一展示@Overridepublic void onComplete() {Log.d(TAG, "获取数据完成");Log.d(TAG,  result  );}});
  • 测试结果

3.2 采用Zip()操作符

  • 功能说明
    在该例中,我将结合结合 RetrofitRxJava,实现:

    1. 从不同数据源(2个服务器)获取数据,即 合并网络请求的发送
    2. 统一显示结果
  • 实现方案
    采用Get方法 对 金山词霸API 发送2个网络请求(将英文翻译成中文,翻译2次) & 将2次翻译的结果一起显示。

采用 Gson 进行数据解析

步骤说明

  1. 添加依赖
  2. 创建 接收服务器返回数据 的类
  3. 创建 用于描述网络请求 的接口
  4. 创建 Retrofit 实例
  5. 创建 网络请求接口实例 并 配置网络请求参数
  6. 发送网络请求
  7. 发送网络请求
  8. 对返回的数据进行处理
  • 步骤实现

步骤1: 添加依赖

a. 在 Gradle加入Retrofit库的依赖

build.gradle

dependencies {// Android 支持 Rxjava
// 此处一定要注意使用RxJava2的版本
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'// Android 支持 Retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'// 衔接 Retrofit & RxJava
// 此处一定要注意使用RxJava2的版本
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'// 支持Gson解析
compile 'com.squareup.retrofit2:converter-gson:2.1.0'}

b. 添加 网络权限
AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>

步骤2:创建 接收服务器返回数据 的类

  • 金山词霸API 的数据格式说明如下:
// URL模板
http://fy.iciba.com/ajax.php// URL实例
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world// 参数说明:
// a:固定值 fy
// f:原文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// t:译文内容类型,日语取 ja,中文取 zh,英语取 en,韩语取 ko,德语取 de,西班牙语取 es,法语取 fr,自动则取 auto
// w:查询内容
  • 根据 金山词霸API 的数据格式,创建 接收服务器返回数据 的类:

为了演示是两个网络请求,所以对应设置2个接收服务器的数据类

<-- Translation1.java -->
public class Translation1 {private int status;private content content;private static class content {private String from;private String to;private String vendor;private String out;private int errNo;}//定义 输出返回数据 的方法public String show() {return ("第1次翻译=" + content.out);}
}<-- Translation2.java -->
public class Translation2 {private int status;private content content;private static class content {private String from;private String to;private String vendor;private String out;private int errNo;}//定义 输出返回数据 的方法public String show() {return ("第2次翻译=" + content.out);}
}

步骤3:创建 用于描述网络请求 的接口

采用 注解 + Observable<...>接口描述 网络请求参数

GetRequest_Interface.java

public interface GetRequest_Interface {// 网络请求1@GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")Observable<Translation1> getCall();// 网络请求2@GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20china")Observable<Translation2> getCall_2();// 注解里传入 网络请求 的部分URL地址// Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里// 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略// 采用Observable<...>接口// getCall()是接受网络请求数据的方法}

接下来的步骤均在MainActivity.java内实现(请看注释)

MainActivity.java

public class MainActivity extends AppCompatActivity {private static final String TAG = "Rxjava";// 定义Observable接口类型的网络请求对象Observable<Translation1> observable1;Observable<Translation2> observable2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 步骤1:创建Retrofit对象Retrofit retrofit = new Retrofit.Builder().baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖).addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava.build();// 步骤2:创建 网络请求接口 的实例GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);// 步骤3:采用Observable<...>形式 对 2个网络请求 进行封装observable1 = request.getCall().subscribeOn(Schedulers.io()); // 新开线程进行网络请求1observable2 = request.getCall_2().subscribeOn(Schedulers.io());// 新开线程进行网络请求2// 即2个网络请求异步 & 同时发送// 步骤4:通过使用Zip()对两个网络请求进行合并再发送Observable.zip(observable1, observable2,new BiFunction<Translation1, Translation2, String>() {// 注:创建BiFunction对象传入的第3个参数 = 合并后数据的数据类型@Overridepublic String apply(Translation1 translation1,Translation2 translation2) throws Exception {return translation1.show() + " & " +translation2.show();}}).observeOn(AndroidSchedulers.mainThread()) // 在主线程接收 & 处理数据.subscribe(new Consumer<String>() {// 成功返回数据时调用@Overridepublic void accept(String combine_infro) throws Exception {// 结合显示2个网络请求的数据结果Log.d(TAG, "最终接收到的数据是:" + combine_infro);}}, new Consumer<Throwable>() {// 网络请求错误时调用@Overridepublic void accept(Throwable throwable) throws Exception {System.out.println("登录失败");}});}
}
  • 测试结果

china不翻译改为welcome

Android RxJava操作符的学习---组合合并操作符---合并数据源并展示相关推荐

  1. Android RxJava操作符的学习---组合合并操作符---联合判断多个事件

    1. 需求场景 需要同时对多个事件进行联合判断 如,填写表单时,需要表单里所有信息(姓名.年龄.职业等)都被填写后,才允许点击 "提交" 按钮 2. 功能说明 此处采用 填写表单 ...

  2. Android RxJava操作符的学习---组合 / 合并操作符

    3.3 组合 / 合并操作符 3.3.1. 作用 组合 多个被观察者(Observable) & 合并需要发送的事件 应用场景 组合多个被观察者 合并多个事件 发送事件前追加发送事件 统计发送 ...

  3. Android RxJava操作符的学习---组合合并操作符---从磁盘或内存缓存中获取缓存数据

    1. 需求场景 2. 功能说明 对于从磁盘 / 内存缓存中 获取缓存数据 的功能逻辑如下: 3. 具体实现 详细请看代码注释 // 该2变量用于模拟内存缓存 & 磁盘缓存中的数据String ...

  4. Android RxJava操作符的学习---条件 / 布尔操作符

    3.6 条件 / 布尔操作符 3.6.1. 作用 通过设置函数,判断被观察者(Observable)发送的事件是否符合条件 3.6.2. 类型 RxJava2中,条件 / 布尔操作符的类型包括: 下面 ...

  5. RxJava进阶一(创建类操作符)

    RxJava进阶一(创建类操作符) RxJava进阶二(转换类操作符) RxJava进阶三(过滤类操作符) RxJava进阶四(组合类操作符) 前面已经对RxJava原理进行介绍,相信大家对于RXJa ...

  6. Android :RxJava学习笔记之合并操作符

    RxJava --合并操作符 合并操作符 1.concat() / concatArray() 2.merge() / mergeArray() 3.concatDelayError() / merg ...

  7. JavaScript使用 nullish coalescing operator(空值合并操作符??)导致部分Android手机打不开H5页面的解决方法

    目录 前言 空值合并操作符?? 解决方法 方法一 方法二 如何判断浏览器是否支持ES某一特性 支持

  8. RxJava(10-操作符原理自定义操作符)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 目录: 文章目录 1. 自定义创建操作符 2. 数据序列操作符(lift) ①. 源码分析 ②. 自定义序列 ...

  9. (四)Flutter 学习之 Dart 操作符、控制流和异常处理

    Flutter系列文章目录导读: (一)Flutter学习之Dart变量和类型系统 (二)Flutter学习之Dart展开操作符 和 Control Flow Collections (三)Flutt ...

最新文章

  1. CentOS基础命令大全
  2. 小块头大性能才能得到用户的青睐
  3. CS通用项目系统搭建——三层架构第一天
  4. TensorFlow莫烦 placehoder (三)
  5. js 判断变量是否有值返回bool_有没有办法可以获得javascript函数返回值里的bool值,代码如下:...
  6. go websocket 关闭_Go实战--使用之gorilla/websocket
  7. Mine Sweeper II
  8. centos安装php服务器,在CentOS上安装搭建PHP+Apache+Mysql的服务器环境方法
  9. 汇编html文档,欢迎走进HTML的世界汇编.ppt
  10. 第六节:又一种新的数据类型:元组Tuple
  11. Apache Log4j2详解,【高级Java架构师系统学习
  12. ubuntu + pycharm + anaconda + pyqt4 + tools 配置
  13. 吴恩达的21节Deeplearning.ai课程学习经验总结
  14. atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
  15. 11年的macbook还能用吗_致我2011年买的macbook pro 15寸一封信
  16. nmap快速扫描大量主机端口方法
  17. EC6110M/T-Q21A/C/E-EC6108V9/V9C/V9U/V9A/V9E/V9I/V92/V97-V9C悦me/CA全系列包
  18. 计算机图形学设计线宽代码,计算机图形学画圆并改变线宽.pdf
  19. 窄带包络Matlab分析,窄带随机过程的产生及其性能测试
  20. 恍恍惚惚,哈哈,35. Search Insert Position

热门文章

  1. 【机器学习】人像分类(四)——灰度矩阵恢复成灰度图
  2. android百度地图定位,改变MyLocationOverlay默认图标(原始为蓝色点)(两种方法)
  3. java的actionlistener_Java:ActionListener接口
  4. 售前管理——怎样写解决方案
  5. 小写金额转换成大写金额的函数
  6. Linux Network- Muti_thread and Multi_process TCP server
  7. APK改之理 手游修改改编安卓程序工具安装使用教程
  8. seaborn boxplot 箱线图
  9. arcgis上下标问题
  10. 郭美姣出售霓裳舞的香水