您的位置:首页 > 理论基础 > 计算机网络

Android RxJava 实战讲解:优雅实现 网络请求轮询

2017-11-07 10:08 567 查看
转自-----http://blog.csdn.net/carson_ho/article/details/78256466


前言

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



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

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

本系列文章主要基于 
Rxjava
2.0
 

接下来的时间,我将持续推出 
Android
中 
Rxjava
2.0
 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!




目录




1. 需求场景



注:关于 
Rxjava
中的延时创建操作符
interval()
 和 
intervalRange()
的使用请看文章Android
RxJava:最基础的操作符详解 - 创建操作符


2. 功能说明

本文将采用
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 的数据格式,创建 接收服务器返回数据 的类:

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<Translation> getCall();
// 注解里传入 网络请求 的部分URL地址
// Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
// 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
// 采用Observable<...>接口
// getCall()是接受网络请求数据的方法
}


接下来的步骤均在RxJavafixRxjava.java内实现(请看注释)


RxJavafixRxjava.java
public class RxJavafixRxjava extends AppCompatActivity {

private static final String TAG = "Rxjava";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

/*
* 步骤1:采用interval()延迟发送
* 注:此处主要展示无限次轮询,若要实现有限次轮询,仅需将interval()改成intervalRange()即可
**/
Observable.interval(2,1, TimeUnit.SECONDS)
// 参数说明:
// 参数1 = 第1次延迟时间;
// 参数2 = 间隔时间数字;
// 参数3 = 时间单位;
// 该例子发送的事件特点:延迟2s后发送事件,每隔1秒产生1个数字(从0开始递增1,无限个)

/*
* 步骤2:每次发送数字前发送1次网络请求(doOnNext()在执行Next事件前调用)
* 即每隔1秒产生1个数字前,就发送1次网络请求,从而实现轮询需求
**/
.doOnNext(new Consumer<Long>() {
@Override
public void accept(Long integer) throws Exception {
Log.d(TAG, "第 " + integer + " 次轮询" );

/*
* 步骤3:通过Retrofit发送网络请求
**/
// a. 创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/") // 设置 网络请求 Url
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
.build();

// b. 创建 网络请求接口 的实例
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);

// c. 采用Observable<...>形式 对 网络请求 进行封装
Observable<Translation> observable = request.getCall();
// d. 通过线程切换发送网络请求
observable.subscribeOn(Schedulers.io())               // 切换到IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread())  // 切换回到主线程 处理请求结果
.subscribe(new Observer<Translation>() {
@Override
public void onSubscribe(Disposable d) {
}

@Override
public void onNext(Translation result) {
// e.接收服务器返回的数据
result.show() ;
}

@Override
public void onError(Throwable e) {
Log.d(TAG, "请求失败");
}

@Override
public void onComplete() {

}
});

}
}).subscribe(new Observer<Long>() {
@Override
public void onSubscribe(Disposable d) {

}
@Override
public void onNext(Long value) {

}

@Override
public void onError(Throwable e) {
Log.d(TAG, "对Error事件作出响应");
}

@Override
public void onComplete() {
Log.d(TAG, "对Complete事件作出响应");
}
});

}
}


3.3 测试结果




4. Demo地址

Carson_Ho的Github地址 = RxJava2实战系列:轮询


5. 总结

本文主要讲解了 
Rxjava
创建操作符的实际开发需求场景:轮询需求
,并结合
Retrofit
 与
RxJava
 实现
接下来的时间,我将持续推出 
Android
中 
Rxjava
2.0
 的一系列文章,包括原理、操作符、应用场景、背压等等 ,有兴趣可以继续关注Carson_Ho的安卓开发笔记!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐