Android:RxJava 結(jié)合 Retrofit 優(yōu)雅實(shí)現(xiàn) 網(wǎng)絡(luò)請(qǐng)求輪詢(xún)

姓名:白國(guó)樂(lè)

學(xué)號(hào):17021210898

專(zhuān)業(yè):信號(hào)與信息處理

轉(zhuǎn)載自:http://blog.csdn.net/carson_ho/article/details/78558790,有刪節(jié)

【嵌牛導(dǎo)讀】Rxjava,由于其基于事件流的鏈?zhǔn)秸{(diào)用坪圾、邏輯簡(jiǎn)潔 & 使用簡(jiǎn)單的特點(diǎn)棘街,深受各大Android開(kāi)發(fā)者的歡迎焙压。

【嵌牛鼻子】Rxjava硕勿、實(shí)現(xiàn)

【嵌牛提問(wèn)】如何實(shí)現(xiàn)RxJava ?

【嵌牛正文】目錄

1. 需求場(chǎng)景

注:關(guān)于Rxjava中的repeatWhen()操作符的使用請(qǐng)看文章Android RxJava:功能性操作符 全面講解

2. 功能說(shuō)明

采用Get方法對(duì) 金山詞霸API 按規(guī)定時(shí)間重復(fù)發(fā)送網(wǎng)絡(luò)請(qǐng)求迹炼,從而模擬 輪詢(xún) 需求實(shí)現(xiàn)

停止輪詢(xún)的條件 = 當(dāng)輪詢(xún)到第4次時(shí)

采用Gson進(jìn)行數(shù)據(jù)解析

3. 具體實(shí)現(xiàn)

下面仔燕,我將結(jié)合 `Retrofit` 與`RxJava` 實(shí)現(xiàn) 有條件的輪詢(xún)需求

3.1 步驟說(shuō)明

添加依賴(lài)

創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類(lèi)

創(chuàng)建 用于描述網(wǎng)絡(luò)請(qǐng)求 的接口(區(qū)別于Retrofit傳統(tǒng)形式)

創(chuàng)建 Retrofit 實(shí)例

創(chuàng)建 網(wǎng)絡(luò)請(qǐng)求接口實(shí)例 并 配置網(wǎng)絡(luò)請(qǐng)求參數(shù)(區(qū)別于Retrofit傳統(tǒng)形式)

發(fā)送網(wǎng)絡(luò)請(qǐng)求(區(qū)別于Retrofit傳統(tǒng)形式)

發(fā)送網(wǎng)絡(luò)請(qǐng)求

對(duì)返回的數(shù)據(jù)進(jìn)行處理

本實(shí)例側(cè)重于說(shuō)明RxJava的輪詢(xún)需求舟误,關(guān)于Retrofit的使用請(qǐng)看文章:這是一份很詳細(xì)的 Retrofit 2.0 使用教程(含實(shí)例講解)

3.2 步驟實(shí)現(xiàn)

步驟1: 添加依賴(lài)

a. 在 `Gradle`加入`Retrofit`庫(kù)的依賴(lài)*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. 添加 網(wǎng)絡(luò)權(quán)限*AndroidManifest.xml*

1

步驟2:創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類(lèi)

金山詞霸API的數(shù)據(jù)格式說(shuō)明如下:

//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ù)說(shuō)明:// a:固定值 fy// f:原文內(nèi)容類(lèi)型葡秒,日語(yǔ)取 ja,中文取 zh嵌溢,英語(yǔ)取 en眯牧,韓語(yǔ)取 ko,德語(yǔ)取 de赖草,西班牙語(yǔ)取 es学少,法語(yǔ)取 fr,自動(dòng)則取 auto// t:譯文內(nèi)容類(lèi)型疚顷,日語(yǔ)取 ja旱易,中文取 zh,英語(yǔ)取 en腿堤,韓語(yǔ)取 ko阀坏,德語(yǔ)取 de,西班牙語(yǔ)取 es笆檀,法語(yǔ)取 fr忌堂,自動(dòng)則取 auto// w:查詢(xún)內(nèi)容

示例

根據(jù) 金山詞霸API 的數(shù)據(jù)格式,創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類(lèi):

Translation.java

publicclassTranslation {privateintstatus;privatecontent content;privatestaticclasscontent {privateStringfrom;privateString to;privateString vendor;privateStringout;privateinterrNo;? ? }//定義 輸出返回?cái)?shù)據(jù) 的方法publicvoidshow() {? ? ? ? Log.d("RxJava", content.out);? ? }}

步驟3:創(chuàng)建 用于描述網(wǎng)絡(luò)請(qǐng)求 的接口

采用注解+Observable<...>接口描述 網(wǎng)絡(luò)請(qǐng)求參數(shù)

GetRequest_Interface.java

publicinterfaceGetRequest_Interface {? ? @GET("ajax.php?a=fy&f=auto&t=auto&w=hi%20world")? ? Observable 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ù)的方法}

接下來(lái)的步驟均在RxJavafixRxjava.java內(nèi)實(shí)現(xiàn)(請(qǐng)看注釋?zhuān)?/p>

RxJavafixRxjava.java

publicclassRxJavafixRetrofitextendsAppCompatActivity{privatestaticfinalString TAG ="Rxjava";// 設(shè)置變量 = 模擬輪詢(xún)服務(wù)器次數(shù)privateinti =0;@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);? ? ? ? setContentView(R.layout.activity_main);// 步驟1:創(chuàng)建Retrofit對(duì)象Retrofit retrofit =newRetrofit.Builder()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .baseUrl("http://fy.iciba.com/")// 設(shè)置 網(wǎng)絡(luò)請(qǐng)求 Url.addConverterFactory(GsonConverterFactory.create())//設(shè)置使用Gson解析(記得加入依賴(lài)).addCallAdapterFactory(RxJava2CallAdapterFactory.create())// 支持RxJava.build();// 步驟2:創(chuàng)建 網(wǎng)絡(luò)請(qǐng)求接口 的實(shí)例GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);// 步驟3:采用Observable<...>形式 對(duì) 網(wǎng)絡(luò)請(qǐng)求 進(jìn)行封裝Observable observable = request.getCall();// 步驟4:發(fā)送網(wǎng)絡(luò)請(qǐng)求 & 通過(guò)repeatWhen()進(jìn)行輪詢(xún)observable.repeatWhen(newFunction, ObservableSource>() {@Override// 在Function函數(shù)中,必須對(duì)輸入的 Observable進(jìn)行處理樱衷,此處使用flatMap操作符接收上游的數(shù)據(jù)publicObservableSourceapply(@NonNull Observable objectObservable)throwsException {// 將原始 Observable 停止發(fā)送事件的標(biāo)識(shí)(Complete() /? Error())轉(zhuǎn)換成1個(gè) Object 類(lèi)型數(shù)據(jù)傳遞給1個(gè)新被觀(guān)察者(Observable)// 以此決定是否重新訂閱 & 發(fā)送原來(lái)的 Observable棋嘲,即輪詢(xún)// 此處有2種情況:// 1. 若返回1個(gè)Complete() /? Error()事件,則不重新訂閱 & 發(fā)送原來(lái)的 Observable矩桂,即輪詢(xún)結(jié)束// 2. 若返回其余事件沸移,則重新訂閱 & 發(fā)送原來(lái)的 Observable,即繼續(xù)輪詢(xún)r(jià)eturnobjectObservable.flatMap(newFunction>() {@OverridepublicObservableSourceapply(@NonNull Object throwable)throwsException {// 加入判斷條件:當(dāng)輪詢(xún)次數(shù) = 5次后侄榴,就停止輪詢(xún)if(i >3) {// 此處選擇發(fā)送onError事件以結(jié)束輪詢(xún)雹锣,因?yàn)榭捎|發(fā)下游觀(guān)察者的onError()方法回調(diào)returnObservable.error(newThrowable("輪詢(xún)結(jié)束"));? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }// 若輪詢(xún)次數(shù)<4次,則發(fā)送1Next事件以繼續(xù)輪詢(xún)// 注:此處加入了delay操作符癞蚕,作用 = 延遲一段時(shí)間發(fā)送(此處設(shè)置 = 2s)蕊爵,以實(shí)現(xiàn)輪詢(xún)間間隔設(shè)置returnObservable.just(1).delay(2000, TimeUnit.MILLISECONDS);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? });? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? }).subscribeOn(Schedulers.io())// 切換到IO線(xiàn)程進(jìn)行網(wǎng)絡(luò)請(qǐng)求.observeOn(AndroidSchedulers.mainThread())// 切換回到主線(xiàn)程 處理請(qǐng)求結(jié)果.subscribe(newObserver() {@OverridepublicvoidonSubscribe(Disposable d) {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }@OverridepublicvoidonNext(Translation result) {// e.接收服務(wù)器返回的數(shù)據(jù)result.show() ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? i++;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }@OverridepublicvoidonError(Throwable e) {// 獲取輪詢(xún)結(jié)束信息Log.d(TAG,? e.toString());? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }@OverridepublicvoidonComplete() {? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? });? ? ? ? ? ? ? ? ? ? }? ? }

3.3? 測(cè)試結(jié)果

4. Demo地址

Carson_Ho的Github地址 = RxJava2實(shí)戰(zhàn)系列:有條件的輪詢(xún)

關(guān)于無(wú)條件的網(wǎng)絡(luò)請(qǐng)求輪詢(xún),具體請(qǐng)看文章Android RxJava 實(shí)際應(yīng)用講解:網(wǎng)絡(luò)請(qǐng)求輪詢(xún)

5. 總結(jié)

本文主要講解了Rxjava創(chuàng)建操作符的實(shí)際開(kāi)發(fā)需求場(chǎng)景:有條件輪詢(xún)需求桦山,并結(jié)合Retrofit與RxJava實(shí)現(xiàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攒射,一起剝皮案震驚了整個(gè)濱河市醋旦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匆篓,老刑警劉巖浑度,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸦概,居然都是意外死亡箩张,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)窗市,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)先慷,“玉大人,你說(shuō)我怎么就攤上這事咨察÷畚酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵摄狱,是天一觀(guān)的道長(zhǎng)脓诡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)媒役,這世上最難降的妖魔是什么祝谚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮酣衷,結(jié)果婚禮上交惯,老公的妹妹穿的比我還像新娘。我一直安慰自己穿仪,他們只是感情好席爽,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著啊片,像睡著了一般只锻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上紫谷,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天齐饮,我揣著相機(jī)與錄音,去河邊找鬼碴里。 笑死沈矿,一個(gè)胖子當(dāng)著我的面吹牛上真,可吹牛的內(nèi)容都是我干的咬腋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼睡互,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼根竿!你這毒婦竟也來(lái)了陵像?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寇壳,失蹤者是張志新(化名)和其女友劉穎醒颖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體壳炎,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泞歉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匿辩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腰耙。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铲球,靈堂內(nèi)的尸體忽然破棺而出挺庞,到底是詐尸還是另有隱情,我是刑警寧澤稼病,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布选侨,位于F島的核電站,受9級(jí)特大地震影響然走,放射性物質(zhì)發(fā)生泄漏援制。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一丰刊、第九天 我趴在偏房一處隱蔽的房頂上張望隘谣。 院中可真熱鬧,春花似錦啄巧、人聲如沸寻歧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)码泛。三九已至,卻和暖如春澄耍,著一層夾襖步出監(jiān)牢的瞬間噪珊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工齐莲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痢站,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓选酗,卻偏偏與公主長(zhǎng)得像阵难,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芒填,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容