300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Android RxJava操作符的学习---创建操作符--(无条件)网络请求轮询

Android RxJava操作符的学习---创建操作符--(无条件)网络请求轮询

时间:2021-10-27 19:24:29

相关推荐

Android RxJava操作符的学习---创建操作符--(无条件)网络请求轮询

1. 需求场景

2. 功能说明

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

采用Gson进行数据解析

3. 具体实现

下面结合RetrofitRxJava实现轮询需求

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 支持 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

<uses-permission android:name="android.permission.INTERNET"/>

步骤2:创建 接收服务器返回数据 的类

金山词霸API的数据格式说明如下:

// URL模板/ajax.php// URL实例/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";@Overrideprotected 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>() {@Overridepublic void accept(Long integer) throws Exception {Log.d(TAG, "第 " + integer + " 次轮询" );/** 步骤3:通过Retrofit发送网络请求**/// a. 创建Retrofit对象Retrofit retrofit = new Retrofit.Builder().baseUrl("/") // 设置 网络请求 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>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Translation result) {// e.接收服务器返回的数据result.show() ;}@Overridepublic void onError(Throwable e) {Log.d(TAG, "请求失败");}@Overridepublic void onComplete() {}});}}).subscribe(new Observer<Long>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic void onNext(Long value) {}@Overridepublic void onError(Throwable e) {Log.d(TAG, "对Error事件作出响应");}@Overridepublic void onComplete() {Log.d(TAG, "对Complete事件作出响应");}});}}

3.3 测试结果

Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.

注意:依赖compile改为 implementation

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。