1. 程式人生 > >Android RxJava 實戰講解:優雅實現 網路請求輪詢

Android RxJava 實戰講解:優雅實現 網路請求輪詢

轉自-----http://blog.csdn.net/carson_ho/article/details/78256466


前言

  • Rxjava,由於其基於事件流的鏈式呼叫、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎。

Github截圖

如果還不瞭解RxJava,請看文章:Android:這是一篇 清晰 & 易懂的Rxjava 入門教程


  • RxJava如此受歡迎的原因,在於其提供了豐富 & 功能強大的操作符,幾乎能完成所有的功能需求
  • 今天,我將為大家帶來 Rxjava
    建立操作符的常見開發應用場景:輪詢需求 ,並結合Retrofit 與RxJava 實現,希望大家會喜歡。 

  1. 本系列文章主要基於 Rxjava 2.0 
  2. 接下來的時間,我將持續推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、應用場景、背壓等等 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記!!
    示意圖

目錄

示意圖


1. 需求場景

示意圖

注:關於 Rxjava中的延時建立操作符interval()

 和 intervalRange()的使用請看文章Android RxJava:最基礎的操作符詳解 - 建立操作符


2. 功能說明

本文將採用Get方法對 金山詞霸API 按規定時間 重複傳送網路請求,從而模擬 輪詢 需求實現

採用 Gson 進行資料解析

金山詞典


3. 具體實現

下面我將結合 Retrofit 與RxJava 實現輪詢需求

3.1 步驟說明

  1. 新增依賴
  2. 建立 接收伺服器返回資料 的類
  3. 建立 用於描述網路請求 的介面(區別於傳統Retrofit
    形式)
  4. 建立 Retrofit 例項
  5. 建立 網路請求介面例項 並 配置網路請求引數(區別於傳統Retrofit形式)
  6. 傳送網路請求(區別於傳統Retrofit形式)
  7. 傳送網路請求
  8. 對返回的資料進行處理

本例項側重於說明 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 支援 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. 新增 網路許可權 
AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET"/>
步驟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格式說明

  • 根據 金山詞霸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";

    @Override
    protected 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>() {
            @Override
            public void accept(Long integer) throws Exception {
                Log.d(TAG, "第 " + integer + " 次輪詢" );

                 /*
                  * 步驟3:通過Retrofit傳送網路請求
                  **/
                  // a. 建立Retrofit物件
                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl("http://fy.iciba.com/") // 設定 網路請求 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>() {
                            @Override
                            public void onSubscribe(Disposable d) {
                            }

                            @Override
                            public void onNext(Translation result) {
                                // e.接收伺服器返回的資料
                                result.show() ;
                            }

                            @Override
                            public void onError(Throwable e) {
                                Log.d(TAG, "請求失敗");
                            }

                            @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, "對Error事件作出響應");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "對Complete事件作出響應");
            }
        });


    }
}



3.3 測試結果

示意圖


4. Demo地址

Carson_Ho的Github地址 = RxJava2實戰系列:輪詢


5. 總結

  • 本文主要講解了 Rxjava建立操作符的實際開發需求場景:輪詢需求 ,並結合Retrofit 與RxJava 實現
  • 接下來的時間,我將持續推出 Android中 Rxjava 2.0 的一系列文章,包括原理、操作符、應用場景、背壓等等 ,有興趣可以繼續關注Carson_Ho的安卓開發筆記!!

示意圖