Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android RxJava应用:合并数据源

Android RxJava应用:合并数据源

作者头像
Carson.Ho
发布于 2022-03-25 06:13:40
发布于 2022-03-25 06:13:40
80900
代码可运行
举报
文章被收录于专栏:Android知识分享Android知识分享
运行总次数:0
代码可运行

前言

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

  • RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求
  • 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:合并数据源需求 ,并结合RetrofitRxJava 实现,希望大家会喜欢。

Carson带你学RxJava系列文章,包括 原理、操作符、应用场景、背压等等,请看文章:Android:这是一份全面 & 详细的RxJava学习指南

目录

1. 需求场景

2. 功能说明

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

3. 具体实现

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

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

3.1 采用 Merge()操作符

  • 具体实现

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 用于存放最终展示的数据
        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>() {
                    @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  );
                    }
                });
  • 测试结果

3.2 采用Zip()操作符

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

  • 功能说明 在该例中,我将结合结合 RetrofitRxJava,实现:
代码语言:txt
AI代码解释
复制
1. 从不同数据源(2个服务器)获取数据,即 **合并网络请求的发送**
2. 统一显示结果实现方案
采用

采用 Gson 进行数据解析

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

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

  • 步骤实现
步骤1: 添加依赖

a. 在 Gradle加入Retrofit库的依赖

build.gradle

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<uses-permission android:name="android.permission.INTERNET"/>
步骤2:创建 接收服务器返回数据 的类
  • 金山词霸API 的数据格式说明如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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个接收服务器的数据类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<-- 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {


        private static final String TAG = "Rxjava";


        // 定义Observable接口类型的网络请求对象
        Observable<Translation1> observable1;
        Observable<Translation2> 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<Translation1, Translation2, String>() {
                        // 注:创建BiFunction对象传入的第3个参数 = 合并后数据的数据类型
                        @Override
                        public String apply(Translation1 translation1,
                                            Translation2 translation2) throws Exception {
                            return translation1.show() + " & " +translation2.show();
                        }
                    }).observeOn(AndroidSchedulers.mainThread()) // 在主线程接收 & 处理数据
                    .subscribe(new Consumer<String>() {
                        // 成功返回数据时调用
                        @Override
                        public void accept(String combine_infro) throws Exception {
                            // 结合显示2个网络请求的数据结果
                            Log.d(TAG, "最终接收到的数据是:" + combine_infro);
                        }
                    }, new Consumer<Throwable>() {
                        // 网络请求错误时调用
                        @Override
                        public void accept(Throwable throwable) throws Exception {
                            System.out.println("登录失败");
                        }
                    });
        }
}
  • 测试结果

4. 总结

  • 本文主要讲解了 Rxjava的实际开发需求场景:合并数据源需求 ,并结合RetrofitRxJava 实现
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android:Retrofit 与 RxJava联合使用大合集(含实例教程)!
下面,我将采用最基础的 `Retrofit + RxJava` 实现 网络请求 的功能
Carson.Ho
2019/02/22
4.1K0
Android RxJava 实战讲解:合并数据源 & 同时展示数据
前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的R
Carson.Ho
2019/02/22
3.6K2
Android RxJava应用:优雅实现网络请求轮询(有条件)
Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Carson.Ho
2022/03/25
1.2K0
Android RxJava应用:优雅实现网络请求轮询(有条件)
Android RxJava应用:优雅实现网络请求嵌套回调
今天,我将为大家带来 Rxjava创建操作符的实际开发需求场景:网络请求嵌套回调 需求 ,并结合Retrofit 与RxJava 实现,希望大家会喜欢。
Carson.Ho
2022/03/25
1.3K0
Android RxJava应用:优雅实现网络请求嵌套回调
Android:RxJava 结合 Retrofit 优雅实现 网络请求轮询
采用Get方法对 金山词霸API 按规定时间重复发送网络请求,从而模拟 轮询 需求实现
Carson.Ho
2019/02/22
2.2K0
Android:RxJava 结合 Retrofit 全面实现 网络请求出错重连
前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的R
Carson.Ho
2019/02/22
1.8K0
Android RxJava 实战讲解:优雅实现 网络请求轮询
注:关于 Rxjava中的延时创建操作符interval() 和 intervalRange()的使用请看文章Android RxJava:最基础的操作符详解 - 创建操作符
Carson.Ho
2019/02/22
2.5K0
Android RxJava应用:网络请求出错重连(结合Retrofit)
Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Carson.Ho
2022/03/25
1.5K0
Android RxJava应用:网络请求出错重连(结合Retrofit)
Android RxJava 实战系列:优雅实现 网络请求嵌套回调
Carson_Ho的Github地址 = RxJava2实战系列:网络请求嵌套回调
Carson.Ho
2019/02/22
2.3K0
Android RxJava应用:优雅实现网络请求轮询(无条件)
Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Carson.Ho
2022/03/25
9660
Android RxJava应用:优雅实现网络请求轮询(无条件)
Carson带你学Android:RxJava线程控制(含实例讲解)
Rxjava由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。本文主要讲解的是: 线程控制(也称为调度 / 切换),即讲解功能性操作符中的:subscribeOn() & observeOn()
Carson.Ho
2021/12/06
9610
Carson带你学Android:RxJava线程控制(含实例讲解)
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) - 简书
步骤1:添加Retrofit库的依赖 步骤2:创建 接收服务器返回数据 的类 步骤3:创建 用于描述网络请求 的接口 步骤4:创建 Retrofit 实例 步骤5:创建 网络请求接口实例 并 配置网络请求参数 步骤6:发送网络请求(异步 / 同步)
用户2802329
2018/08/07
9.6K0
这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) - 简书
Android RxJava操作符详解系列: 创建操作符
a. 发送的事件序列 = 从0开始、无限递增1的的整数序列 b. 作用类似于interval(),但可指定发送的数据的数量
Carson.Ho
2019/02/22
7290
不求服务端,自己改接口!Charles抓包工具的应用
这篇文章主要是介绍 Charles 在开发阶段的使用方式,突出实用性,至于Charles 的介绍和配置,不是我们本文的重点,还没配置的同学可以参考这篇博文,很详细了:http://www.jianshu.com/p/fdd7c681929c 前言 作为移动开发工程师,平时开发阶段跟接口相关的工作都是要和服务端的小伙伴进行对接的,在对接的过程中一定会有一些不太方便的地方。 那么,今天我要给大家介绍一下「Charles」这款抓包软件,使用 Charles ,数据接口相关的接口和调试工作将变的高效、简单、痛
小之丶
2018/03/07
1.3K0
不求服务端,自己改接口!Charles抓包工具的应用
Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)
步骤1:添加Retrofit库的依赖 步骤2:创建 接收服务器返回数据 的类 步骤3:创建 用于描述网络请求 的接口 步骤4:创建 Retrofit 实例 步骤5:创建 网络请求接口实例 并 配置网络请求参数 步骤6:发送网络请求(异步 / 同步)
Carson.Ho
2022/01/21
3.7K0
Carson带你学Android:这是一份详细的 Retrofit使用教程(含实例讲解)
Android RxJava操作符详解 系列:组合 / 合并操作符
测试结果:第1个被观察者的Error事件将在第2个被观察者发送完事件后再继续发送
Carson.Ho
2019/02/22
2.2K0
Android RxJava的使用
首语 最近因为项目上线,挤不出时间,已经好久没有更新博客了😛,目前项目也做差不多了,写几篇总结类型的博客,梳理一下。 本文主要对RxJava及常用操作符的使用进行总结,同时对RxJava在Android中几种常见的使用场景进行举例。 简介 RxJava是Reactive Extensions的Java VM实现:该库用于通过使用可观察的序列来组成异步和基于事件的程序。 Rx是Reactive Extensions的缩写的简写,它是一个使用可观察数据流进行异步编程的编程接口,Rx结合了观察者模式、迭代器模
八归少年
2022/06/29
3.1K0
Android RxJava的使用
一篇博客让你了解RxJava
RxJava可以说是2016年最流行的项目之一了,最近也接触了一下RxJava,于是想写一篇博客,希望能通过这篇博客让大家能对其进行了解,本篇博客是基于RxJava2.0,跟RxJava1.0还是有很多不同的
老马的编程之旅
2022/06/22
5540
一篇博客让你了解RxJava
Android RxJava应用:功能防抖
Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Carson.Ho
2022/03/25
6310
Android RxJava应用:功能防抖
Android RxJava:一步步带你源码分析 RxJava
步骤1:创建被观察者(Observable)& 定义需发送的事件 步骤2:创建观察者(Observer) & 定义响应事件的行为 步骤3:通过订阅(subscribe)连接观察者和被观察者
Carson.Ho
2019/02/22
6090
推荐阅读
相关推荐
Android:Retrofit 与 RxJava联合使用大合集(含实例教程)!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验