Android:RxJava 结合 Retrofit 优雅实现 网络请求轮询

姓名:白国乐

学号:17021210898

专业:信号与信息处理

转载自:http://blog.csdn.net/carson_ho/article/details/78558790,有删节

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

【嵌牛鼻子】Rxjava、实现

【嵌牛提问】如何实现RxJava ?

【嵌牛正文】目录

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*

1

步骤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

publicclassTranslation {privateintstatus;privatecontent content;privatestaticclasscontent {privateStringfrom;privateString to;privateString vendor;privateStringout;privateinterrNo;    }//定义 输出返回数据 的方法publicvoidshow() {        Log.d("RxJava", content.out);    }}

步骤3:创建 用于描述网络请求 的接口

采用注解+Observable<...>接口描述 网络请求参数

GetRequest_Interface.java

publicinterfaceGetRequest_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

publicclassRxJavafixRetrofitextendsAppCompatActivity{privatestaticfinalString TAG ="Rxjava";// 设置变量 = 模拟轮询服务器次数privateinti =0;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);// 步骤1:创建Retrofit对象Retrofit retrofit =newRetrofit.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(newFunction, ObservableSource>() {@Override// 在Function函数中,必须对输入的 Observable进行处理,此处使用flatMap操作符接收上游的数据publicObservableSourceapply(@NonNull Observable objectObservable)throwsException {// 将原始 Observable 停止发送事件的标识(Complete() /  Error())转换成1个 Object 类型数据传递给1个新被观察者(Observable)// 以此决定是否重新订阅 & 发送原来的 Observable,即轮询// 此处有2种情况:// 1. 若返回1个Complete() /  Error()事件,则不重新订阅 & 发送原来的 Observable,即轮询结束// 2. 若返回其余事件,则重新订阅 & 发送原来的 Observable,即继续轮询returnobjectObservable.flatMap(newFunction>() {@OverridepublicObservableSourceapply(@NonNull Object throwable)throwsException {// 加入判断条件:当轮询次数 = 5次后,就停止轮询if(i >3) {// 此处选择发送onError事件以结束轮询,因为可触发下游观察者的onError()方法回调returnObservable.error(newThrowable("轮询结束"));                                        }// 若轮询次数<4次,则发送1Next事件以继续轮询// 注:此处加入了delay操作符,作用 = 延迟一段时间发送(此处设置 = 2s),以实现轮询间间隔设置returnObservable.just(1).delay(2000, TimeUnit.MILLISECONDS);                                    }                                });                            }                        }).subscribeOn(Schedulers.io())// 切换到IO线程进行网络请求.observeOn(AndroidSchedulers.mainThread())// 切换回到主线程 处理请求结果.subscribe(newObserver() {@OverridepublicvoidonSubscribe(Disposable d) {                                    }@OverridepublicvoidonNext(Translation result) {// e.接收服务器返回的数据result.show() ;                                        i++;                                    }@OverridepublicvoidonError(Throwable e) {// 获取轮询结束信息Log.d(TAG,  e.toString());                                    }@OverridepublicvoidonComplete() {                                    }                                });                    }    }

3.3  测试结果

4. Demo地址

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

关于无条件的网络请求轮询,具体请看文章Android RxJava 实际应用讲解:网络请求轮询

5. 总结

本文主要讲解了Rxjava创建操作符的实际开发需求场景:有条件轮询需求,并结合Retrofit与RxJava实现

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容