Android:RxJava 结合 Retrofit 优雅实现 网络请求轮询
16lz
2021-01-25
前言
Rxjava
,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大Android
开发者的欢迎。
如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的Rxjava 入门教程
RxJava
如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求- 今天,我将为大家带来
Rxjava
创建操作符的实际开发需求场景:有条件的轮询需求 ,并结合Retrofit
与RxJava
实现,希望大家会喜欢。
- 本系列文章主要基于
Rxjava 2.0
- 接下来的时间,我将持续推出
Android
中Rxjava 2.0
的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!
目录
1. 需求场景
注:关于
Rxjava
中的repeatWhen()
操作符的使用请看文章Android RxJava:功能性操作符 全面讲解
2. 功能说明
采用Get
方法对 金山词霸API 按规定时间重复发送网络请求,从而模拟 轮询 需求实现
- 停止轮询的条件 = 当轮询到第4次时
- 采用
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 支持 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 的数据格式,创建 接收服务器返回数据 的类:
Translation.java
public class Translation { 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 { @GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world") Observable getCall(); // 注解里传入 网络请求 的部分URL地址 // Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里 // 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略 // 采用Observable<...>接口 // getCall()是接受网络请求数据的方法}
接下来的步骤均在RxJavafixRxjava.java内实现(请看注释)
RxJavafixRxjava.java
public class RxJavafixRetrofit extends AppCompatActivity { private static final String TAG = "Rxjava"; // 设置变量 = 模拟轮询服务器次数 private int i = 0 ; @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<...>形式 对 网络请求 进行封装 Observable observable = request.getCall(); // 步骤4:发送网络请求 & 通过repeatWhen()进行轮询 observable.repeatWhen(new Function, ObservableSource<?>>() { @Override // 在Function函数中,必须对输入的 Observable
3.3 测试结果
4. Demo地址
Carson_Ho的Github地址 = RxJava2实战系列:有条件的轮询
关于无条件的网络请求轮询,具体请看文章Android RxJava 实际应用讲解:网络请求轮询
5. 总结
- 本文主要讲解了
Rxjava
创建操作符的实际开发需求场景:有条件轮询需求 ,并结合Retrofit
与RxJava
实现 - 下面我将结合 实际场景应用 &
Rxjava
的相关使用框架(如Retrofit
、Eventbus
) ,继续对Android
中Rxjava
的实际开发需求场景进行深入讲解 ,感兴趣的同学可以继续关注carson_ho的微信公众号
请帮顶 / 点赞!因为你的鼓励是我写作的最大动力!
更多相关文章
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- 下载并编译Chrome浏览器For Android
- Android(安卓)Studio中JNI程序的单步调试和日志打印
- Android网络基础1——网络分层
- Android(安卓)获取本机的mac和wifi的BSSID(mac)以及其他信息
- Android(安卓)使用外部db数据库文件
- 网络传输数据解析(SAX)
- Android网络图片请求+二级缓存实现
- Android以太网框架情景分析之启动简介