前言

  • Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Github截图

如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程

  • RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求
  • 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:合并数据源需求 ,并结合RetrofitRxJava 实现,希望大家会喜欢。
  1. 本系列文章主要基于 Rxjava 2.0
  2. 接下来的时间,我将持续推出 AndroidRxjava 2.0 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!
示意图

目录

示意图

1. 需求场景

示意图

2. 功能说明

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


3. 具体实现

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

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

3.1 采用 Merge()操作符

  • 具体实现

关于操作符Merge() 的使用请看文章:Android RxJava:组合 / 合并操作符 详细教程

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

3.2 采用Zip()操作符

关于操作符Zip() 的使用请看文章:Android RxJava:组合 / 合并操作符 详细教程

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

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

采用 Gson 进行数据解析

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

本实例侧重于说明 RxJava 的线程控制,关于Retrofit的使用请看文章:这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)

  • 步骤实现
步骤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 支持 Retrofitcompile '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

步骤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格式说明
  • 根据 金山词霸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 getCall();    // 网络请求2    @GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20china")    Observable 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 observable1;        Observable observable2;        @Override        protected 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()); // 新开线程进行网络请求1            observable2 = request.getCall_2().subscribeOn(Schedulers.io());// 新开线程进行网络请求2            // 即2个网络请求异步 & 同时发送            // 步骤4:通过使用Zip()对两个网络请求进行合并再发送            Observable.zip(observable1, observable2,                    new BiFunction() {                        // 注:创建BiFunction对象传入的第3个参数 = 合并后数据的数据类型                        @Override                        public String apply(Translation1 translation1,                                            Translation2 translation2) throws Exception {                            return translation1.show() + " & " +translation2.show();                        }                    }).observeOn(AndroidSchedulers.mainThread()) // 在主线程接收 & 处理数据                    .subscribe(new Consumer() {                        // 成功返回数据时调用                        @Override                        public void accept(String combine_infro) throws Exception {                            // 结合显示2个网络请求的数据结果                            Log.d(TAG, "最终接收到的数据是:" + combine_infro);                        }                    }, new Consumer() {                        // 网络请求错误时调用                        @Override                        public void accept(Throwable throwable) throws Exception {                            System.out.println("登录失败");                        }                    });        }}
  • 测试结果
示意图
  • Demo地址
    Carson_Ho的Github地址:RxJava_合并数据源

4. 总结

  • 本文主要讲解了 Rxjava的实际开发需求场景:合并数据源需求 ,并结合RetrofitRxJava 实现
  • 下面我将结合 实际场景应用 & Rxjava的相关使用框架(如RetrofitEventbus ,继续对 AndroidRxjava 的实际开发需求场景进行深入讲解
    示意图

感兴趣的同学可以继续关注本人运营的Wechat Public Account

  • 我想给你们介绍一个与众不同的Android微信公众号(福利回赠)
  • 我想邀请您和我一起写Android(福利回赠)

请点赞!因为你的鼓励是我写作的最大动力!

相关文章阅读

  • 操作符使用
    Android:这是一篇 清晰 & 易懂的Rxjava 入门教程
    Android RxJava:最基础的操作符详解 - 创建操作符
    Android RxJava:图文详解 变换操作符
    Android RxJava:组合 / 合并操作符 详细教程
    Android RxJava:功能性操作符 全面讲解
  • 实际应用讲解
    Android RxJava 实际应用讲解:(无条件)网络请求轮询
    Android RxJava 实际应用讲解:(有条件)网络请求轮询
    Android RxJava 实际应用讲解:网络请求嵌套回调
    Android RxJava 实际应用讲解:合并数据源
    Android RxJava 实际应用讲解:从磁盘 / 内存缓存中 获取缓存数据
    Android RxJava 实际应用讲解:联合判断
    Android RxJava:细说 线程控制(切换 / 调度 )(含Retrofit实例讲解)
    Android RxJava 实际应用讲解:网络请求出错重连(结合Retrofit)

欢迎关注Carson_Ho的!

不定期分享关于安卓开发的干货,追求短、平、快,但却不缺深度

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  4. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  5. 整理一下Android的面试题
  6. Android(安卓)Gson使用入门及GsonFormat插件的使用
  7. androidのXlist框架上拉下拉刷新案例
  8. Android初学笔记——五:数据存储
  9. Android(安卓)---Application 开发中共享全局数据

随机推荐

  1. android 测试简介
  2. Android应用程序安装过程源代码分析(4)
  3. Android 学习笔记--android――Notificat
  4. 解决 ButterKnife8.2.1 与 Dagger2.5 冲
  5. webview 底部被遮住
  6. Cocos2d-x权限问题
  7. Android 手机震动
  8. android SDK manager 无法获取更新版本列
  9. Android Studio3.1.2 build.gradle class
  10. Android简单明了的使用属性动画ObjectAni