前言
Rxjava
羊初,由于其基于事件流的鏈?zhǔn)秸{(diào)用、邏輯簡(jiǎn)潔 & 使用簡(jiǎn)單的特點(diǎn),深受各大 Android
開發(fā)者的歡迎猫胁。
如果還不了解RxJava,請(qǐng)看文章:Android:這是一篇 清晰 & 易懂的Rxjava 入門教程
-
RxJava
如此受歡迎的原因跛锌,在于其提供了豐富 & 功能強(qiáng)大的操作符弃秆,幾乎能完成所有的功能需求 - 今天,我將為大家?guī)?
Rxjava
創(chuàng)建操作符的常見開發(fā)應(yīng)用場(chǎng)景:輪詢需求 髓帽,并結(jié)合Retrofit
與RxJava
實(shí)現(xiàn)菠赚,希望大家會(huì)喜歡。
Carson帶你學(xué)RxJava系列文章郑藏,包括 原理衡查、操作符、應(yīng)用場(chǎng)景必盖、背壓等等拌牲,請(qǐng)關(guān)注看文章:Android:這是一份全面 & 詳細(xì)的RxJava學(xué)習(xí)指南
目錄
1. 需求場(chǎng)景
注:關(guān)于 Rxjava
中的延時(shí)創(chuàng)建操作符interval()
和 intervalRange()
的使用請(qǐng)看文章Android RxJava:最基礎(chǔ)的操作符詳解 - 創(chuàng)建操作符
2. 功能說明
本文將采用Get
方法對(duì) 金山詞霸API 按規(guī)定時(shí)間 重復(fù)發(fā)送網(wǎng)絡(luò)請(qǐng)求,從而模擬 輪詢 需求實(shí)現(xiàn)
采用
Gson
進(jìn)行數(shù)據(jù)解析
3. 具體實(shí)現(xiàn)
下面我將結(jié)合 Retrofit
與RxJava
實(shí)現(xiàn)輪詢需求
3.1 步驟說明
- 添加依賴
- 創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類
- 創(chuàng)建 用于描述網(wǎng)絡(luò)請(qǐng)求 的接口(區(qū)別于傳統(tǒng)
Retrofit
形式) - 創(chuàng)建
Retrofit
實(shí)例 - 創(chuàng)建 網(wǎng)絡(luò)請(qǐng)求接口實(shí)例 并 配置網(wǎng)絡(luò)請(qǐng)求參數(shù)(區(qū)別于傳統(tǒng)
Retrofit
形式) - 發(fā)送網(wǎng)絡(luò)請(qǐng)求(區(qū)別于傳統(tǒng)
Retrofit
形式) - 發(fā)送網(wǎng)絡(luò)請(qǐng)求
- 對(duì)返回的數(shù)據(jù)進(jìn)行處理
本實(shí)例側(cè)重于說明
RxJava
的輪詢需求歌粥,關(guān)于Retrofit
的使用請(qǐng)看文章:這是一份很詳細(xì)的 Retrofit 2.0 使用教程(含實(shí)例講解)
3.2 步驟實(shí)現(xiàn)
步驟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. 添加 網(wǎng)絡(luò)權(quán)限
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
步驟2:創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類
- 金山詞霸
API
的數(shù)據(jù)格式說明如下:
// URL模板
http://fy.iciba.com/ajax.php
// URL實(shí)例
http://fy.iciba.com/ajax.php?a=fy&f=auto&t=auto&w=hello%20world
// 參數(shù)說明:
// a:固定值 fy
// f:原文內(nèi)容類型塌忽,日語取 ja,中文取 zh失驶,英語取 en土居,韓語取 ko,德語取 de嬉探,西班牙語取 es擦耀,法語取 fr,自動(dòng)則取 auto
// t:譯文內(nèi)容類型涩堤,日語取 ja眷蜓,中文取 zh,英語取 en定躏,韓語取 ko账磺,德語取 de,西班牙語取 es痊远,法語取 fr,自動(dòng)則取 auto
// w:查詢內(nèi)容
- 示例
- 根據(jù) 金山詞霸API 的數(shù)據(jù)格式氏捞,創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類:
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;
}
//定義 輸出返回?cái)?shù)據(jù) 的方法
public void show() {
Log.d("RxJava", content.out );
}
}
步驟3:創(chuàng)建 用于描述網(wǎng)絡(luò)請(qǐng)求 的接口
采用 注解 + Observable<...>
接口描述 網(wǎng)絡(luò)請(qǐng)求參數(shù)
GetRequest_Interface.java
public interface GetRequest_Interface {
@GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")
Observable<Translation> getCall();
// 注解里傳入 網(wǎng)絡(luò)請(qǐng)求 的部分URL地址
// Retrofit把網(wǎng)絡(luò)請(qǐng)求的URL分成了兩部分:一部分放在Retrofit對(duì)象里碧聪,另一部分放在網(wǎng)絡(luò)請(qǐng)求接口里
// 如果接口里的url是一個(gè)完整的網(wǎng)址,那么放在Retrofit對(duì)象里的URL可以忽略
// 采用Observable<...>接口
// getCall()是接受網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)的方法
}
接下來的步驟均在RxJavafixRxjava.java內(nèi)實(shí)現(xiàn)(請(qǐng)看注釋)
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()延遲發(fā)送
* 注:此處主要展示無限次輪詢液茎,若要實(shí)現(xiàn)有限次輪詢逞姿,僅需將interval()改成intervalRange()即可
**/
Observable.interval(2,1, TimeUnit.SECONDS)
// 參數(shù)說明:
// 參數(shù)1 = 第1次延遲時(shí)間辞嗡;
// 參數(shù)2 = 間隔時(shí)間數(shù)字;
// 參數(shù)3 = 時(shí)間單位滞造;
// 該例子發(fā)送的事件特點(diǎn):延遲2s后發(fā)送事件续室,每隔1秒產(chǎn)生1個(gè)數(shù)字(從0開始遞增1,無限個(gè))
/*
* 步驟2:每次發(fā)送數(shù)字前發(fā)送1次網(wǎng)絡(luò)請(qǐng)求(doOnNext()在執(zhí)行Next事件前調(diào)用)
* 即每隔1秒產(chǎn)生1個(gè)數(shù)字前谒养,就發(fā)送1次網(wǎng)絡(luò)請(qǐng)求挺狰,從而實(shí)現(xiàn)輪詢需求
**/
.doOnNext(new Consumer<Long>() {
@Override
public void accept(Long integer) throws Exception {
Log.d(TAG, "第 " + integer + " 次輪詢" );
/*
* 步驟3:通過Retrofit發(fā)送網(wǎng)絡(luò)請(qǐng)求
**/
// a. 創(chuàng)建Retrofit對(duì)象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fy.iciba.com/") // 設(shè)置 網(wǎng)絡(luò)請(qǐng)求 Url
.addConverterFactory(GsonConverterFactory.create()) //設(shè)置使用Gson解析(記得加入依賴)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) // 支持RxJava
.build();
// b. 創(chuàng)建 網(wǎng)絡(luò)請(qǐng)求接口 的實(shí)例
GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
// c. 采用Observable<...>形式 對(duì) 網(wǎng)絡(luò)請(qǐng)求 進(jìn)行封裝
Observable<Translation> observable = request.getCall();
// d. 通過線程切換發(fā)送網(wǎng)絡(luò)請(qǐng)求
observable.subscribeOn(Schedulers.io()) // 切換到IO線程進(jìn)行網(wǎng)絡(luò)請(qǐng)求
.observeOn(AndroidSchedulers.mainThread()) // 切換回到主線程 處理請(qǐng)求結(jié)果
.subscribe(new Observer<Translation>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Translation result) {
// e.接收服務(wù)器返回的數(shù)據(jù)
result.show() ;
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "請(qǐng)求失敗");
}
@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, "對(duì)Error事件作出響應(yīng)");
}
@Override
public void onComplete() {
Log.d(TAG, "對(duì)Complete事件作出響應(yīng)");
}
});
}
}
3.3 測(cè)試結(jié)果
注:關(guān)于有條件的網(wǎng)絡(luò)請(qǐng)求輪詢,具體請(qǐng)看文章:Android RxJava 實(shí)際應(yīng)用講解:(有條件)網(wǎng)絡(luò)請(qǐng)求輪詢
4. Demo地址
Carson_Ho的Github地址 = RxJava2實(shí)戰(zhàn)系列:輪詢
喜歡的麻煩點(diǎn)個(gè)
star
买窟!
5. 總結(jié)
- 本文主要講解了
Rxjava
創(chuàng)建操作符的實(shí)際開發(fā)需求場(chǎng)景:輪詢需求 丰泊,并結(jié)合Retrofit
與RxJava
實(shí)現(xiàn) - Carson帶你學(xué)RxJava系列文章:
入門
Carson帶你學(xué)Android:這是一篇清晰易懂的Rxjava入門教程
Carson帶你學(xué)Android:面向初學(xué)者的RxJava使用指南
Carson帶你學(xué)Android:RxJava2.0到底更新了什么?
原理
Carson帶你學(xué)Android:圖文解析RxJava原理
Carson帶你學(xué)Android:手把手帶你源碼分析RxJava
使用教程:操作符
Carson帶你學(xué)Android:RxJava操作符教程
Carson帶你學(xué)Android:RxJava創(chuàng)建操作符
Carson帶你學(xué)Android:RxJava功能性操作符
Carson帶你學(xué)Android:RxJava過濾操作符
Carson帶你學(xué)Android:RxJava組合/合并操作符
Carson帶你學(xué)Android:RxJava變換操作符
Carson帶你學(xué)Android:RxJava條件/布爾操作符
實(shí)戰(zhàn)
Carson帶你學(xué)Android:什么時(shí)候應(yīng)該使用Rxjava始绍?(開發(fā)場(chǎng)景匯總)
Carson帶你學(xué)Android:RxJava線程控制(含實(shí)例講解)
Carson帶你學(xué)Android:圖文詳解RxJava背壓策略
Carson帶你學(xué)Android:RxJava瞳购、Retrofit聯(lián)合使用匯總(含實(shí)例教程)
Carson帶你學(xué)Android:優(yōu)雅實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求嵌套回調(diào)
Carson帶你學(xué)Android:網(wǎng)絡(luò)請(qǐng)求輪詢(有條件)
Carson帶你學(xué)Android:網(wǎng)絡(luò)請(qǐng)求輪詢(無條件)
Carson帶你學(xué)Android:網(wǎng)絡(luò)請(qǐng)求出錯(cuò)重連(結(jié)合Retrofit)
Carson帶你學(xué)Android:合并數(shù)據(jù)源
Carson帶你學(xué)Android:聯(lián)想搜索優(yōu)化
Carson帶你學(xué)Android:功能防抖
Carson帶你學(xué)Android:從磁盤/內(nèi)存緩存中獲取緩存數(shù)據(jù)
Carson帶你學(xué)Android:聯(lián)合判斷
歡迎關(guān)注Carson_Ho的簡(jiǎn)書
不定期分享關(guān)于安卓開發(fā)的干貨,追求短亏推、平学赛、快,但卻不缺深度吞杭。