Android RxJava應(yīng)用:網(wǎng)絡(luò)請(qǐng)求輪詢(無條件)

前言

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é)合RetrofitRxJava 實(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é)合 RetrofitRxJava 實(shí)現(xiàn)輪詢需求

3.1 步驟說明

  1. 添加依賴
  2. 創(chuàng)建 接收服務(wù)器返回?cái)?shù)據(jù) 的類
  3. 創(chuàng)建 用于描述網(wǎng)絡(luò)請(qǐng)求 的接口(區(qū)別于傳統(tǒng)Retrofit形式)
  4. 創(chuàng)建 Retrofit 實(shí)例
  5. 創(chuàng)建 網(wǎng)絡(luò)請(qǐng)求接口實(shí)例 并 配置網(wǎng)絡(luò)請(qǐng)求參數(shù)(區(qū)別于傳統(tǒng)Retrofit形式)
  6. 發(fā)送網(wǎng)絡(luò)請(qǐng)求(區(qū)別于傳統(tǒng)Retrofit形式)
  7. 發(fā)送網(wǎng)絡(luò)請(qǐng)求
  8. 對(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)容
  • 示例
API格式說明
  • 根據(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é)合RetrofitRxJava 實(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ā)的干貨,追求短亏推、平学赛、快,但卻不缺深度吞杭。


請(qǐng)點(diǎn)贊盏浇!因?yàn)槟愕墓膭?lì)是我寫作的最大動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篇亭,一起剝皮案震驚了整個(gè)濱河市缠捌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌译蒂,老刑警劉巖曼月,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柔昼,居然都是意外死亡哑芹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門捕透,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聪姿,“玉大人,你說我怎么就攤上這事乙嘀∧┕海” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵虎谢,是天一觀的道長盟榴。 經(jīng)常有香客問我,道長婴噩,這世上最難降的妖魔是什么擎场? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任羽德,我火速辦了婚禮,結(jié)果婚禮上迅办,老公的妹妹穿的比我還像新娘宅静。我一直安慰自己,他們只是感情好站欺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布姨夹。 她就那樣靜靜地躺著,像睡著了一般镊绪。 火紅的嫁衣襯著肌膚如雪匀伏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天蝴韭,我揣著相機(jī)與錄音够颠,去河邊找鬼。 笑死榄鉴,一個(gè)胖子當(dāng)著我的面吹牛履磨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庆尘,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼剃诅,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了驶忌?” 一聲冷哼從身側(cè)響起矛辕,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎付魔,沒想到半個(gè)月后聊品,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡几苍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年翻屈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妻坝。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伸眶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刽宪,到底是詐尸還是另有隱情厘贼,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布圣拄,位于F島的核電站涂臣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏售担。R本人自食惡果不足惜赁遗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望族铆。 院中可真熱鬧岩四,春花似錦、人聲如沸哥攘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逝淹。三九已至耕姊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栅葡,已是汗流浹背茉兰。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欣簇,地道東北人规脸。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像熊咽,于是被迫代替她去往敵國和親莫鸭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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