Android RxJava应用:优雅实现网络请求嵌套回调
前言
Rxjava
,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大Android
开发者的欢迎。
今天,我将为大家带来 Rxjava
创建操作符的实际开发需求场景:网络请求嵌套回调 需求 ,并结合Retrofit
与RxJava
实现,希望大家会喜欢。
Carson带你学RxJava系列文章,包括 原理、操作符、应用场景、背压等等,请看文章:Android:这是一份全面 & 详细的RxJava学习指南
目录
1. 需求场景
1.1 背景
需要进行嵌套网络请求:即在第1个网络请求成功后,继续再进行一次网络请求
如 先进行 用户注册 的网络请求, 待注册成功后回再继续发送 用户登录 的网络请求
1.2 冲突
嵌套实现网络请求较为复杂,即嵌套调用函数
下面展示的是结合
Retrofit
与RxJava
的基本用法,即未用操作符前
// 发送注册网络请求的函数方法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. 功能说明
- 实现功能:发送嵌套网络请求(将英文翻译成中文,翻译两次)
- 为了让大家都能完成
Demo
,所以通过 公共的金山词霸API 来模拟 “注册 - 登录”嵌套网络请求- 即先翻译
Register
(注册),再翻译Login
(登录)
- 实现方案:采用
Get
方法对 金山词霸API 发送网络请求
采用
Gson
进行数据解析
3. 具体实现
下面我将结合 Retrofit
与RxJava
实现网络请求嵌套
3.1 步骤说明
- 添加依赖
- 创建 接收服务器返回数据 的类
- 创建 用于描述网络请求 的接口(区别于
Retrofit
传统形式) - 创建 Retrofit 实例
- 创建 网络请求接口实例 并 配置网络请求参数(区别于
Retrofit
传统形式) - 发送网络请求(区别于
Retrofit
传统形式) - 发送网络请求
- 对返回的数据进行处理
本实例侧重于说明
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
变换操作符的实际开发需求场景:嵌套回调需求 ,并结合Retrofit
与RxJava
实现 - 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应用:优雅实现网络请求嵌套回调相关推荐
- Android RxJava操作符的学习---变换操作符---网络请求嵌套回调
变换操作符的主要开发需求场景 = 嵌套回调(Callback hell) 下面,我将采用一个实际应用场景实例来讲解嵌套回调(Callback hell) 1. 需求场景 1.1 背景 需要进行嵌套网络 ...
- Android RxJava应用:优雅实现网络请求轮询(无条件)
前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. 今天,我将为大家带来 Rxjava创建操作符的常见开发应用场景:轮询需求 ...
- android okgo 参数map,OkGo 网络请求框架介绍与使用说明
前言 使用 Android Studio 用户 一般来说,只需要添加第一个 okgo 的核心包即可,其余的三个库根据自己的需要选择添加. //必须使用 compile 'com.lzy.net:okg ...
- android 请求方式有哪些,Android中的几种网络请求方式详解
Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面整理四种常用网络请求方式. java.net包中的HttpURLConnection类 Get方式: // Get方式请求 ...
- Android Asynchronous Http Client-Android异步网络请求客户端接口
1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用and ...
- Android 9.0以上HTTP网络请求被限制解决方案
问题 Android 9.0以上系统,HTTP网络访问请求被限制:但是HTTPS无影响. Android 10系统同样有此问题. 为保证访问安全,Android P以上要求网络请求必须为Https:H ...
- Android 避免主线程执行网络请求之Activity/Fragment 结束后处理异步回调
大家都知道Android涉及到与UI相关的操作只能在主线程执行 android4.0以后就禁止在主线程进行网络请求了,在主线程里面执行Http请求都会报NetworkOnMainThreadExcep ...
- Android 页面或文件或网络请求时的加载动画
//加载图片或页面或网络请求时出现加载动画 public Class LoadingAnimation{ private static LoadingAnimation loadingAnimatio ...
- Moya+ RxSwift+HandyJSON 优雅处理网络请求
前言 在移动端的开发中,网络请求是必不可少的.之前写过Alamofire的简单使用,但是一般开发中都会对这些第三库封装,然后使用,之前自己封装的demo也是借鉴了一些Moya的设计思路.今天就介绍一下 ...
- android多个网络请求如何依次执行,Android 并发和串行网络请求
需求 假如有上面的需求,我们从MVC模型上考虑,View层可以使用ListView的多Type,Model层可以考虑串行和并行处理数据,下面分别给出两种不同的处理思路 串行思路 这里直接给出一般的串行 ...
最新文章
- 文科生也能当工程师?我用了一年半
- illegalargumentexception是什么异常_线程出现异常!应该如何处理?
- 右边补0 润乾报表_关于润乾报表的补充说明 -
- JavaWeb:用JDBC操作数据库
- 1046 Shortest Distance (20 分)【难度: 简单 / 知识点: 前缀和 / 破环成链】
- 字符串常量前面的L的作用
- mysql limit优化
- 奥运加油,中国加油!!!
- git pull忽略指定文件_Git忽略提交规则
- gc日志怎么看_你应该怎么监控Kafka?
- java tts引擎_Android TTS系列二——如何开发一款系统级tts引擎?
- python数据应用场景_python应用场景
- Facebook Messenger 被曝漏洞,可导致恶意软件获得持续访问权限(详细分析)
- 用 scipy.weave 嵌入 C 语言
- UVA 10330 Power Transmission
- Hibernate使用手册(官网)
- 408计算机考研后期规划-10月起
- Linux学习笔记(一):Linux常用命令
- 计算机下桌面显示不出来,电脑桌面文档不会在右边显示出来怎么办
- 服务器攻击方式与查看服务器攻击日志的方法