前言

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

f17851fffda83eff8b63791ad8a00e50.png

RxJava如此受欢迎的原因,在于其提供了丰富 & 功能强大的操作符,几乎能完成所有的功能需求

今天,笔者将为大家带来Rxjava创建操作符的常见开发应用场景:轮询需求 ,并结合Retrofit与RxJava实现,希望大家会喜欢。

本系列文章主要基于Rxjava 2.0

8018476db6edca0b43f5ce43bd57b6c2.png

目录

18abb861a15af15123e55cf309171623.png

1. 需求场景

6174d1c57c50c1f16d802a3b18ac8204.png

2. 功能说明

本文将采用Get方法对 金山词霸API 按规定时间 重复发送网络请求,从而模拟 轮询 需求实现

采用Gson进行数据解析

66b2e3be5c8717c49eaa2d66ec8e13f1.png

3. 具体实现

下面将结合Retrofit与RxJava实现轮询需求

3.1 步骤说明

添加依赖

创建 接收服务器返回数据 的类

创建 用于描述网络请求 的接口(区别于传统Retrofit形式)

创建Retrofit实例

创建 网络请求接口实例 并 配置网络请求参数(区别于传统Retrofit形式)

发送网络请求(区别于传统Retrofit形式)

发送网络请求

对返回的数据进行处理

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

步骤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:查询内容

示例

2a148a764cfec4f5c9973a9ad0b3b35c.png

根据 金山词霸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 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() {

@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 observable = request.getCall();

// d. 通过线程切换发送网络请求

observable.subscribeOn(Schedulers.io()) // 切换到IO线程进行网络请求

.observeOn(AndroidSchedulers.mainThread()) // 切换回到主线程 处理请求结果

.subscribe(new Observer() {

@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() {

@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 测试结果

1265ed1205b586c882638b039e7f4a21.gif

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐