找到屬於自己的RxJava+Retrofit2網絡請求

現在網絡上面鋪天蓋地都是RxJava+Retrofit2的博客,還有好多大神不斷地造輪子。然後在前段時間,由於項目的空檔期,我就對自己現在負責的項目嘗試了一下這RxJava+Retrofit2的寫法,對於我來說,首先是大量地看各位大神的博客,從中不斷吸取精華,在結合自己公司的後臺完成的一套屬於自己項目的一套網絡請求。下面我只針對我的項目情況來描述我的理解。

1.Retrofit介紹

2.Gradle配置

3.簡單使用Retrofit2+RxJava

4.自定義JSON解析、錯誤請求處理、攔截器、降低代碼冗餘。

  • Retrofit介紹

Retrofit是SQUARE美國一家移動支付公司最近新發布的在Android平臺上http訪問的開源項目,Retrofit與okhttp共同出自於Square公司,我們在HttpClient被棄用後,在HttpURLConnection使用的期間,大家想必會發現okHttp的網絡請求開源項目,然後在網絡拼命搜okHttp的二次封裝,然而retrofit對okhttp做了一層封裝,把網絡請求都交給給了Okhttp,我們只需要通過簡單的配置就能使用retrofit來進行網絡請求了。

  • Gradle配置

首先我們在Gradle文件中進行配置
這裏寫圖片描述
然而對於RxJava和Retrofit的版本差異我就不詳細描述,有興趣的同學可以逐一去學習。

  • 簡單使用Retrofit2+RxJava

    1. 創建Retrofit2請求工具類
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("url")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
2. 定義請求API
    @FormUrlEncoded
    @POST(URLs.Login)
    Observable<LoginBean> login(@FieldMap() Map<String, String> maps);
3. 簡單使用
        RetrofitManage.getInstance().getHttpServiceConnection().login(maps)
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io()) 
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<LoginBean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(LoginBean loginBean) {

                    }
                });

上面的是最簡單的Retrofit2+RxJava的用法,對於還處於認知階段的同學可以參考一下,但是對於已經有一定了解的同學,上面說的可能一點用處都沒有,下面我們纔是本篇的重點。在Retrofit2+RxJava使用過程中,我們結合項目,其實會遇到很多不同的問題,我們應該如何再次優化、再次封裝。

如何適應不同的項目不同業務

  • 代碼過多重複

重複的RxJava處理,我們可以封裝一個方法統一使用RxJava來處理。
這裏寫圖片描述

另外大家都可以看到我們每一次的請求,你需要多次重複的寫回調處理,我們需要再次優化。
這裏寫圖片描述

最終效果
這裏寫圖片描述
我們不用每一次的請求去寫大量重複的代碼,這樣給人一種較爲整潔的感覺。

  • 我的後臺返回數據各種奇葩、原始數據嵌套多層、某情況需前端特殊處理返回數據等等(過多不吐槽),我們不能順利使用GsonConverterFactory來轉化我們需要的JavaBean,於是我們定義一個適用的JsonConverterFactory。

RetrofitManage爲:
這裏寫圖片描述

JsonConverterFactory爲:
這裏寫圖片描述

JsonResponseBodyConverter爲:
這裏寫圖片描述

這樣我們可以將我們請求到的數據流轉成JSONObject對象,然後再根據自己需要解析數據組裝JavaBean。

  • 如何處理錯誤請求和異常數據

在上面的JSON截取處理中,大家可以看到我對非正常返回(小於0)的情況會拋出一個ResultException的自定義異常,然後轉到Subscriber的onError中處理,還有我們在請求數據,會遇到各種錯誤的網絡請求結果,我們可以在封裝的ProgressSubscriber類中統一來處理。
ResultException類爲:
這裏寫圖片描述

ProgressSubscriber中onError()統一處理錯誤結果
這裏寫圖片描述

  • 攔截器

對於我們的請求,okHttp還有很多的特點,例如請求攔截器header,動態注入cookie,加入https請求信任等等處理。這裏我來簡單說一下攔截器。
我們是在初始化RetrofitManage處理OkHttpClient:
這裏寫圖片描述


總結:
上述就是我在使用RxJava+Retrofit2的時候遇到的問題,我根據自身需要來封裝網絡請求,大家在網上各種各樣的博客中都會找到適合自己的一種方式,但是我們沒有必要如何完美封裝如何完美使用這那框架的,第三方的庫會幫我們封裝底層的一些代碼,避免我們做重複多餘易出錯的事情,讓我們專注於業務邏輯,所以學習任何一個第三方庫都將是簡單的,不應該複雜不該複雜的地方。
源碼將會在下篇的RxJava+Retrofit2+MVP博客一起上傳。謝謝大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章