1. 程式人生 > >RxJava+Retrofit+OkHttp深入淺出-終極封裝二(網路請求)

RxJava+Retrofit+OkHttp深入淺出-終極封裝二(網路請求)

CSDN部落格釋出了一系列的RxJava+Retrofit+OkHttp深入淺出-終極封裝 之前發出後收到很多朋友的關注,原本只是自己學習後的一些經驗總結,但是有同學運用到實戰當中,這讓我很惶恐,所有後續一直更新了很多次版本,有些地方難免有所變動導致之前的部落格有所出入,正好最近受到掘金邀請內測部落格,所以決定重新寫一版,按照最後迭代完成的封裝詳細的講述一遍,歡迎大家關注!

注意:由於本章的特殊性,後續文章比較長而且複雜,涉及內容也很多,所以大家準備好茶水,前方高能預警。

封裝成果

封裝完以後,具有如下功能:

    1.Retrofit+Rxjava+okhttp基本使用方法
    2.統一處理請求資料格式
    3
.統一的ProgressDialog和回撥Subscriber處理 4.取消http請求 5.預處理http請求 6.返回資料的統一判斷 7.失敗後的retry封裝處理 8.RxLifecycle管理生命週期,防止洩露

實現效果:

具體使用

封裝後http請求程式碼如下

//    完美封裝簡化版
    private void simpleDo() {
        SubjectPost postEntity = new SubjectPost(simpleOnNextListener,this);
        postEntity.setAll(true
); HttpManager manager = HttpManager.getInstance(); manager.doHttpDeal(postEntity); } // 回撥一一對應 HttpOnNextListener simpleOnNextListener = new HttpOnNextListener<List<Subject>>() { @Override public void onNext(List<Subject> subjects) { tvMsg.setText("已封裝:\n"
+ subjects.toString()); } /*使用者主動呼叫,預設是不需要覆寫該方法*/ @Override public void onError(Throwable e) { super.onError(e); tvMsg.setText("失敗:\n" + e.toString()); } };

是不是很簡單?你可能說這還簡單,好咱們對比一下正常使用Retrofit的方法

/**  
    * Retrofit加入rxjava實現http請求  
    */  
   private void onButton9Click() {  
       //手動建立一個OkHttpClient並設定超時時間  
       okhttp3.OkHttpClient.Builder builder = new OkHttpClient.Builder();  
       builder.connectTimeout(5, TimeUnit.SECONDS);  

       Retrofit retrofit = new Retrofit.Builder()  
               .client(builder.build())  
               .addConverterFactory(GsonConverterFactory.create())  
               .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
               .baseUrl(HttpManager.BASE_URL)  
               .build();  

/        載入框  
       final ProgressDialog pd = new ProgressDialog(this);  

       HttpService apiService = retrofit.create(HttpService.class);  
       Observable<RetrofitEntity> observable = apiService.getAllVedioBy(true);  
       observable.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())  
               .subscribe(  
                       new Subscriber<RetrofitEntity>() {  
                           @Override  
                           public void onCompleted() {  
                               if (pd != null && pd.isShowing()) {  
                                   pd.dismiss();  
                               }  
                           }  

                           @Override  
                           public void onError(Throwable e) {  
                               if (pd != null && pd.isShowing()) {  
                                   pd.dismiss();  
                               }  
                           }  

                           @Override  
                           public void onNext(RetrofitEntity retrofitEntity) {  
                               tvMsg.setText("無封裝:\n" + retrofitEntity.getData().toString());  
                           }  

                           @Override  
                           public void onStart() {  
                               super.onStart();  
                               pd.show();  
                           }  
                       }  

               );  
   }

可能你發現確是程式碼有點多,但是更加可怕的是,如果你一個activity或者fragment中多次需要http請求,你需要多次重複的寫回調處理(一個回到就有4個方法呀!!!!反正我是忍受不了),而且以上處理還沒有做過多的判斷和錯誤校驗就如此複雜!~好了介紹完了,開始咱們的優化之路吧!

專案結構:

RxJava

如果你對RxJava不瞭解,好吧騷年趕快學學吧,不然真會out了,下面給出博主當初學習RxJava的一些資源:

Retrofit

咱家今天的主角來了,咱們也深入淺出一下了解下Retrofit使用,前方高能,如果你是深度Retrofit選手請直接跳過本節!!!

1.首先確保在AndroidManifest.xml中請求了網路許可權

<uses-permission android:name="android.permission.INTERNET"/>

2.在app/build.gradle新增引用

  /*rx-android-java*/
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
    compile 'com.trello:rxlifecycle:1.0'
    compile 'com.trello:rxlifecycle-components:1.0'
    /*rotrofit*/
    compile 'com.squareup.retrofit2:retrofit:2.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0'
    compile 'com.google.code.gson:gson:2.8.0'

3.常用註解

這裡介紹一些常用的註解的使用

  • @Query@QueryMap:用於Http Get請求傳遞引數

  • @Field:用於Post方式傳遞引數,需要在請求介面方法上新增@FormUrlEncoded,即以表單的方式傳遞引數

  • @Body:用於Post,根據轉換方式將例項物件轉化為對應字串傳遞引數.比如Retrofit新增GsonConverterFactory則是將body轉化為gson字串進行傳遞

  • @Path:用於URL上佔位符

  • @Part:配合@Multipart使用,一般用於檔案上傳

  • @Header:新增http header

  • @Headers:跟@Header作用一樣,只是使用方式不一樣,@Header是作為請求方法的引數傳入,@Headers是以固定方式直接新增到請求方法上

ReTrofit基本使用:

首先給定一個測試介面文件,後面的部落格中我們都是用這個介面除錯

/**  
 * @api    videoLink    50音圖視訊連結  
 * @url    http://www.izaodao.com/Api/AppFiftyToneGraph/videoLink  
 * @method post  
 * @param  once_no bool(選填,ture無連結) 一次性獲取下載地址  
 * @return json array(  
 * ret:1成功,2失敗  
 * msg:資訊  
 * data:{  
 *       name:視訊名稱  
 *       title:標題  
 * }  
 )

1.初始化retrofit

要向一個api傳送我們的網路請求 ,我們需要使用Retrofit builder類並指定servicebase URL(通常情況下就是域名)。

String BASE_URL = " http://www.izaodao.com/Api/"  
    Retrofit retrofit = new Retrofit.Builder()  
            .baseUrl(BASE_URL)  
            .addConverterFactory(GsonConverterFactory.create())  
            .build();

2.設定介面service

注意到每個endpoint 都指定了一個關於HTTP(GETPOST, 等等。) 方法的註解以及用於分發網路呼叫的方法。而且這些方法的引數也可以有特殊的註解。

/**  
 * 介面地址  
 * Created by WZG on 2016/7/16.  
 */  
public interface MyApiEndpointInterface {  
    @POST("AppFiftyToneGraph/videoLink")  
    Call<RetrofitEntity> getAllVedio(@Body boolean once_no)             
}

3.得到call然後同步處理處理回撥:

MyApiEndpointInterface apiService = retrofit.create(MyApiEndpointInterface.class);  
Call<RetrofitEntity> call = apiService.getAllVedio(true);  
call.enqueue(new Callback<RetrofitEntity>() {  
    @Override  
    public void onResponse(Response<RetrofitEntity> response, Retrofit retrofit) {  
        RetrofitEntity entity = response.body();  
        Log.i("tag", "onResponse----->" + entity.getMsg());  
    }  

    @Override  
    public void onFailure(Throwable t) {  
        Log.i("tag", "onFailure----->" + t.toString());  

    }  
});

這就是簡單的Retrofit使用步驟,接下來我們結合RxJava講述

ReTrofit+Rxjava基本使用

對比之前的Retrofit使用

1.在於我們需要修改service介面返回資訊我們需要返回一個Observable物件

@POST("AppFiftyToneGraph/videoLink")  
Observable<RetrofitEntity> getAllVedioBy(@Body boolean once_no);

2.然後初始化Retrofit需要新增對Rxjava的適配,注意一定要retrofit2才有這個功能哦

Retrofit retrofit = new Retrofit.Builder()  
                .client(builder.build())  
                .addConverterFactory(GsonConverterFactory.create())  
               .addCallAdapterFactory(RxJavaCallAdapterFactory.create())  
                .baseUrl(HttpManager.BASE_URL)  
                .build();

3.回撥通過RxJava處理

HttpService apiService = retrofit.create(HttpService.class);  
       Observable<RetrofitEntity> observable = apiService.getAllVedioBy(true);  
       observable.subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())  
               .subscribe(  
                       new Subscriber<RetrofitEntity>() {  
                           @Override  
                           public void onCompleted() {  
                           }  

                           @Override  
                           public void onError(Throwable e) {                                
                           }  

                           @Override  
                           public void onNext(RetrofitEntity retrofitEntity) {  
                               tvMsg.setText("無封裝:\n" + retrofitEntity.getData().toString());  
                           }                            
                       }  

               );

簡單的RxJava集合Retrofit的使用就介紹完了,同樣的可以發現使用起來很多重複性的程式碼,而且使用也不是那麼簡單,所以才有了下面的封裝

ReTrofit+Rxjava進階封裝之路

先來一張流程圖壓壓驚

請求資料封裝

1.引數

首先需要封裝的使我們的資料類,在資料類中需要封裝請求中用到的相關資料的設定,比如請求引數、方法、載入框顯示設定等等

public abstract class BaseApi<T> implements Func1<BaseResultEntity<T>, T> {
    //rx生命週期管理
    private SoftReference<RxAppCompatActivity> rxAppCompatActivity;
    /*回撥*/
    private SoftReference<HttpOnNextListener> listener;
    /*是否能取消載入框*/
    private boolean cancel;
    /*是否顯示載入框*/
    private boolean showProgress;
    /*是否需要快取處理*/
    private boolean cache;
    /*基礎url*/
    private  String baseUrl="http://www.izaodao.com/Api/";
    /*方法-如果需要快取必須設定這個引數;不需要不用設定*/
    private String mothed;
    /*超時時間-預設6秒*/
    private int connectionTime = 6;
    /*有網情況下的本地快取時間預設60秒*/
    private int cookieNetWorkTime=60;
    /*無網路的情況下本地快取時間預設30天*/
    private int cookieNoNetWorkTime=24*60*60*30;
}

註釋很詳細,這裡不具體描述了,由於這裡是最後封裝完成以後的程式碼,所以有些內容本章還會部分不會涉及,因為功能太多,還是按照一開始的部落格章節講解。

2.抽象api介面


            
           

相關推薦

RxJava+Retrofit+OkHttp深入淺出-終極封裝網路請求

CSDN部落格釋出了一系列的RxJava+Retrofit+OkHttp深入淺出-終極封裝 之前發出後收到很多朋友的關注,原本只是自己學習後的一些經驗總結,但是有同學運用到實戰當中,這讓我很惶恐,所有後續一直更新了很多次版本,有些地方難免有所變動導致之前的部落格有所出入,正好最近受到掘金邀請內測部落格,所以決

RxJava+Retrofit+OkHttp深入淺出-終極封裝六特殊篇變種String替換Gson自由擴充套件

背景 在之前的封裝1-5Rxjava+ReTrofit+okHttp深入淺出-終極封裝中我們都是通過傳統的GsonConverterFactory自動解析,這樣做確實很方便,使用者能直接獲取返回的物件,不用關心具體的轉換,但是:這隨之而來有很多的缺陷(雖然官網

RxJava + Retrofit + OKHttp + RxLifecycle進一步封裝網路

一、說明          RxJava和Retrofit的基本用法這裡不再闡述,網路上有很多教程,這裡只寫進一步封裝的過程,回顧一下我學習網路封裝的知識。 二、封裝過程         1、先把介面的資料格式理清楚,一般返回的Json格式都是這樣: { "code"

openresty 前端開發輕量級MVC框架封裝渲染篇

這一章主要介紹怎麼使用模板,進行後端渲染,主要用到了lua-resty-template這個庫,直接下載下來,放到lualib裡面就行了,推薦第三方庫,已經框架都放到lualib目錄裡面,lua目錄放專案原始碼,比較好管理,可以知道那些是專案的,哪些是第三方庫,

微信小程式系列4網路請求

wx.request(OBJECT)發起https請求 第一點要注意的是微信小程式只支援https,而且需要在微信公眾平臺後臺設定配置伺服器域名 考慮到前期開發階段不一定弄了https支

載入中的動畫網路請求

public class Util { private static ProgressDialog processDia; /** * 顯示載入中對話方塊 * * @param context */

基於retrofit網路框架的終極封裝()-與retrofit的對接與解耦,以及遇到的坑

在上一篇基於retrofit的網路框架的終極封裝(一)中介紹了頂層api的設計.這裡再沿著程式碼走向往裡說. 由於這裡講的是retrofit的封裝性使用,所以一些retrofit基礎性的使用和配置這裡就不講了. 引數怎麼傳遞到retrofit

微信小程式學習筆記持續更新---小程式網路請求封裝

寫小程式的你是否已經厭倦了傳送網路請求的wx.request?接著看吧。。。 一、目錄結構 在專案同級目錄下utils資料夾裡新建一個fetch.js檔案,(名字看自己喜好) 二、直接上程式碼 // 定義網路請求API地址 const baseURL = 'h

從0開始搭建rxjava+retrofit+mvp+dagger2整合基礎框架rxjava+retrofit網路層搭建

古語有云,沒有規矩,就不成方圓。其實做什麼事都一樣,做什麼事都要有自己熟悉且大家都認同的一套規矩,這樣既能提高自己的做事效率,也方便他人的理解。在移動開發中,mvp是新興的一種軟體開發模式,是經過時間的考驗並且大家都認同的解耦框架。它不僅能讓我們的程式碼邏輯更加清晰,不同層間分工不同又相互協作,服務於我們的專

Rxjava+Retrofit+Gson組合框架的使用

Retrofit 1.Retrofit的簡單示例 首先介紹Retrofit,這個是square公司的產品,它說白了就是對okhttp的封裝,它可以將HTTP API通過註解式程式設計來轉換為JAVA的介面,比如: public interface GitHubServi

Xml解析思想

sun attr 回寫 步驟 tno 文檔加載 規則 sel jaxp XML解析:   * 解析xml可以做:       * 如果xml作為配置文件:讀取       * 如果xml作為傳輸文件:寫,讀   * xml解析思想:       * DOM:將文檔加載

移動端真機調試終極利器-BrowserSync使用方法

默認 地址 server .html 中文路徑 自己 層級 com 可能 1. 安裝 Node.js BrowserSync是基於Node.js的, 是一個Node模塊, 如果您想要快速使用它,也許您需要先安裝一下Node.js 安裝適用於Mac OS,Windows和Li

samba文件共享服務配置(multiuser機制) 共兩節

掛載點 機制 tool 用戶 vim ins 掛載 samba install smb客戶端的multiuser掛載技術 --管理員只需要作一次掛載 --客戶端在訪問掛載點時,若需要不同權限,可臨時切換新的共享用戶【無需重新掛載】 實現方式 --掛載smb共享時啟用mul

Ansible 新手上路

ansible遠程連接 ansible傳文件 ansible報錯 Ansible 二(新手上路)1.遠程連接概述遠程控制: ansible1.2版本及以前的版本,默認使用python寫的paramiko模塊進行控制linux主機。 ansible1.3版本以後,默認使用openssh進

23種設計模式之策略模式

而不是 部分 nts 設定 算法 策略 bstr 算法族 none 策略模式:(分別封裝行為接口,實現算法族,超類裏放行為接口對象,在子類裏具體設定行為對象) 原則:   分離變化部分,封裝接口,基於接口編程各種功能。此模式讓行為算法的變化獨立於算法的使用者。    舉

敏捷沖刺每日報告Java-Team

style 發布 image 集成 實現 修改 構建 長度 完成 第二天報告(10.26 周四) 團隊:Java-Team 成員: 章輝宇(284) 吳政楠(286) 陳陽(PM:288) 韓華頌(142) 胡誌權(143) github地址:htt

Robot Framework自動化測試元素定位

百度一 ble 文件中 成功 .cn 位置 solid web lock 前言 在學習的過程中,可能會誤認為Robot framework 只是個web UI測試工具,更正確的理解Robot framework是個測試框架,之所以可以拿來做web UI層的自動化是國為我們

線段樹區間修改

post 執行 節點 void clu mat tdi queue scan 概述 區間修改即將一個區間內所有值改為一個值(或加上一個值),為了執行快速,我們通常用“懶”標記維護整個區間值的情況,在需要是再將這個“懶”標記傳到該節點的兩個子節點上。 模版(此為在整個區間上加

隨想之運維

運維 log 技術分享 blog clas web nbsp com center 一 運維的發展歷史 二 運維的管理 三 總體架構 四 基礎數據管理 五 運維自動化 隨想之二(運維)

CentOS7.4—Apache優化應用日誌管理

Apache優化應用(日誌管理)Apache優化應用二(日誌管理)目錄第一部分 準備工作第二部分 安裝Apache服務第三部分 日誌管理一(配置日誌分割)第四部分 日誌管理二(配置Awstats日誌分析軟件) 第一部分 準備工作一:服務器:Linux系統—CentOS 7.4;IP地址:192.16