前言

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

今天,我将为大家带来 Rxjava创建操作符的实际开发需求场景:网络请求嵌套回调 需求 ,并结合RetrofitRxJava 实现,希望大家会喜欢。

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


目录


1. 需求场景

1.1 背景

需要进行嵌套网络请求:即在第1个网络请求成功后,继续再进行一次网络请求

如 先进行 用户注册 的网络请求, 待注册成功后回再继续发送 用户登录 的网络请求

1.2 冲突

嵌套实现网络请求较为复杂,即嵌套调用函数

下面展示的是结合 RetrofitRxJava的基本用法,即未用操作符前

// 发送注册网络请求的函数方法private void register() {api.register(new RegisterRequest()).subscribeOn(Schedulers.io())               //在IO线程进行网络请求.observeOn(AndroidSchedulers.mainThread())  //回到主线程去处理请求结果.subscribe(new Consumer<RegisterResponse>() {@Overridepublic void accept(RegisterResponse registerResponse) throws Exception {Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT).show();login();   //注册成功, 调用登录的方法}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {Toast.makeText(MainActivity.this, "注册失败", Toast.LENGTH_SHORT).show();}});}// 发送登录网络请求的函数方法
private void login() {api.login(new LoginRequest()).subscribeOn(Schedulers.io())               //在IO线程进行网络请求.observeOn(AndroidSchedulers.mainThread())  //回到主线程去处理请求结果.subscribe(new Consumer<LoginResponse>() {@Overridepublic void accept(LoginResponse loginResponse) throws Exception {Toast.makeText(MainActivity.this, "登录成功", Toast.LENGTH_SHORT).show();}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();}});}

1.3 解决方案

结合 RxJava2中的变换操作符FlatMap()实现嵌套网络请求

关于该操作符的使用具体请看文章:Android RxJava:图文详解 变换操作符


2. 功能说明

  • 实现功能:发送嵌套网络请求(将英文翻译成中文,翻译两次)
  1. 为了让大家都能完成Demo,所以通过 公共的金山词霸API 来模拟 “注册 - 登录”嵌套网络请求
  2. 即先翻译 Register(注册),再翻译 Login(登录)
  • 实现方案:采用Get方法对 金山词霸API 发送网络请求

采用 Gson 进行数据解析


3. 具体实现

下面我将结合 RetrofitRxJava 实现网络请求嵌套

3.1 步骤说明

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

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

3.2 步骤实现

步骤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个网络请求,所以对应设置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 void show() {Log.d("RxJava", "翻译内容 = " + 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 void show() {Log.d("RxJava", "翻译内容 = " + content.out);}
}
步骤3:创建 用于描述网络请求 的接口

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

GetRequest_Interface.java

public interface GetRequest_Interface {// 网络请求1@GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20register")Observable<Translation1> getCall();// 网络请求2@GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20login")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();observable2 = request.getCall_2();observable1.subscribeOn(Schedulers.io())               // (初始被观察者)切换到IO线程进行网络请求1.observeOn(AndroidSchedulers.mainThread())  // (新观察者)切换到主线程 处理网络请求1的结果.doOnNext(new Consumer<Translation1>() {@Overridepublic void accept(Translation1 result) throws Exception {Log.d(TAG, "第1次网络请求成功");result.show();// 对第1次网络请求返回的结果进行操作 = 显示翻译结果}}).observeOn(Schedulers.io())                 // (新被观察者,同时也是新观察者)切换到IO线程去发起登录请求// 特别注意:因为flatMap是对初始被观察者作变换,所以对于旧被观察者,它是新观察者,所以通过observeOn切换线程// 但对于初始观察者,它则是新的被观察者.flatMap(new Function<Translation1, ObservableSource<Translation2>>() { // 作变换,即作嵌套网络请求@Overridepublic ObservableSource<Translation2> apply(Translation1 result) throws Exception {// 将网络请求1转换成网络请求2,即发送网络请求2return observable2;}}).observeOn(AndroidSchedulers.mainThread())  // (初始观察者)切换到主线程 处理网络请求2的结果.subscribe(new Consumer<Translation2>() {@Overridepublic void accept(Translation2 result) throws Exception {Log.d(TAG, "第2次网络请求成功");result.show();// 对第2次网络请求返回的结果进行操作 = 显示翻译结果}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {System.out.println("登录失败");}});}
}

3.3 测试结果


4. Demo地址

Carson_Ho的Github地址 = RxJava2实战系列:网络请求嵌套回调

喜欢的麻烦点个star


5. 总结

  • 本文主要讲解了 Rxjava 变换操作符的实际开发需求场景:嵌套回调需求 ,并结合RetrofitRxJava 实现
  • Carson带你学RxJava系列文章:

入门
Carson带你学Android:这是一篇清晰易懂的Rxjava入门教程
Carson带你学Android:这是一份面向初学者的RxJava使用指南
Carson带你学Android:RxJava2.0到底更新了什么?(含使用建议)
原理
Carson带你学Android:图文解析RxJava原理
Carson带你学Android:手把手带你源码分析RxJava
使用教程(操作符)
Carson带你学Android:RxJava操作符教程
Carson带你学Android:RxJava创建操作符
Carson带你学Android:RxJava功能性操作符
Carson带你学Android:RxJava过滤操作符
Carson带你学Android:RxJava组合/合并操作符
Carson带你学Android:RxJava变换操作符
Carson带你学Android:RxJava条件/布尔操作符
应用
Carson带你学Android:什么时候应该使用Rxjava?(开发场景汇总)
Carson带你学Android:RxJava线程控制(含实例讲解)
Carson带你学Android:图文详解RxJava背压策略
Carson带你学Android:RxJava、Retrofit联合使用汇总(含实例教程)
Carson带你学Android:优雅实现网络请求嵌套回调
Carson带你学Android:网络请求轮询(有条件)
Carson带你学Android:网络请求轮询(无条件)
Carson带你学Android:网络请求出错重连(结合Retrofit)
Carson带你学Android:合并数据源
Carson带你学Android:联想搜索优化
Carson带你学Android:功能防抖
Carson带你学Android:从磁盘/内存缓存中获取缓存数据
Carson带你学Android:联合判断


欢迎关注Carson_Ho的CSDN博客 与 公众号!

博客链接:https://carsonho.blog.csdn.net/


请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

Android RxJava应用:优雅实现网络请求嵌套回调相关推荐

  1. Android RxJava操作符的学习---变换操作符---网络请求嵌套回调

    变换操作符的主要开发需求场景 = 嵌套回调(Callback hell) 下面,我将采用一个实际应用场景实例来讲解嵌套回调(Callback hell) 1. 需求场景 1.1 背景 需要进行嵌套网络 ...

  2. Android RxJava应用:优雅实现网络请求轮询(无条件)

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...

  3. android okgo 参数map,OkGo 网络请求框架介绍与使用说明

    前言 使用 Android Studio 用户 一般来说,只需要添加第一个 okgo 的核心包即可,其余的三个库根据自己的需要选择添加. //必须使用 compile 'com.lzy.net:okg ...

  4. android 请求方式有哪些,Android中的几种网络请求方式详解

    Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...

  5. Android Asynchronous Http Client-Android异步网络请求客户端接口

    1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...

  6. Android 9.0以上HTTP网络请求被限制解决方案

    问题 Android 9.0以上系统,HTTP网络访问请求被限制:但是HTTPS无影响. Android 10系统同样有此问题. 为保证访问安全,Android P以上要求网络请求必须为Https:H ...

  7. Android 避免主线程执行网络请求之Activity/Fragment 结束后处理异步回调

    大家都知道Android涉及到与UI相关的操作只能在主线程执行 android4.0以后就禁止在主线程进行网络请求了,在主线程里面执行Http请求都会报NetworkOnMainThreadExcep ...

  8. Android 页面或文件或网络请求时的加载动画

    //加载图片或页面或网络请求时出现加载动画 public Class LoadingAnimation{ private static LoadingAnimation loadingAnimatio ...

  9. Moya+ RxSwift+HandyJSON 优雅处理网络请求

    前言 在移动端的开发中,网络请求是必不可少的.之前写过Alamofire的简单使用,但是一般开发中都会对这些第三库封装,然后使用,之前自己封装的demo也是借鉴了一些Moya的设计思路.今天就介绍一下 ...

  10. android多个网络请求如何依次执行,Android 并发和串行网络请求

    需求 假如有上面的需求,我们从MVC模型上考虑,View层可以使用ListView的多Type,Model层可以考虑串行和并行处理数据,下面分别给出两种不同的处理思路 串行思路 这里直接给出一般的串行 ...

最新文章

  1. 文科生也能当工程师?我用了一年半
  2. illegalargumentexception是什么异常_线程出现异常!应该如何处理?
  3. 右边补0 润乾报表_关于润乾报表的补充说明 -
  4. JavaWeb:用JDBC操作数据库
  5. 1046 Shortest Distance (20 分)【难度: 简单 / 知识点: 前缀和 / 破环成链】
  6. 字符串常量前面的L的作用
  7. mysql limit优化
  8. 奥运加油,中国加油!!!
  9. git pull忽略指定文件_Git忽略提交规则
  10. gc日志怎么看_你应该怎么监控Kafka?
  11. java tts引擎_Android TTS系列二——如何开发一款系统级tts引擎?
  12. python数据应用场景_python应用场景
  13. Facebook Messenger 被曝漏洞,可导致恶意软件获得持续访问权限(详细分析)
  14. 用 scipy.weave 嵌入 C 语言
  15. UVA 10330 Power Transmission
  16. Hibernate使用手册(官网)
  17. 408计算机考研后期规划-10月起
  18. Linux学习笔记(一):Linux常用命令
  19. 计算机下桌面显示不出来,电脑桌面文档不会在右边显示出来怎么办
  20. 服务器攻击方式与查看服务器攻击日志的方法

热门文章

  1. html编写花,HTML5的花儿
  2. 近期DDG挖矿病毒防护与分析
  3. 3701汉化包 axure r9_AXURE9最全的WEB设计元件库(分享版).rplib
  4. Java —— 自定义JSR303校验
  5. 如何用 SSH 登录 Kindle 系统
  6. windows10下部署环境并运行Siammask中的demo全过程记录
  7. Java 案例:珠穆朗玛峰的高度
  8. 2015校园O2O商业模式解析——从物流切入
  9. 2022微信大数据挑战赛优胜方案总结
  10. 【洛谷】P1138 第k小整数