Retrofit的理解總結(jié)

Retrofit使用總結(jié)與積累

在安卓項目中使用Retrofit已經(jīng)接近兩年了,但是一直都是按照網(wǎng)上或者公司前輩的使用方式模仿,僅在使用的層面打轉(zhuǎn)。一直也沒有對用法進行總結(jié)和深入理解它的源碼。講解Retrofit的源碼暫時我應(yīng)該還說不太清晰,這里就先總結(jié)一下Retrofit的用法,同時也談一下我對Retrofit本身的理解。當(dāng)然也是翻閱了很多資料之后總結(jié)截取出來的。

對Retrofit的理解

雖然之前一直在使用Retrofit,但是在很長一段時間里我是不清楚它到底是什么東西的,最近我才翻閱了一些資料總結(jié)了一下,起碼算是明白了它到底是什么。

稍微熟悉Retrofit的大兄弟都知道Retrofit是一個基于 OkHttp 的 RESTful API 請求工具。意思就是Retrofit網(wǎng)絡(luò)訪問框架用來做請求的實際上還是Okhttp,Retrofit只是在Okhttp上做了一層封裝。

Retrofit和Okhttp的聯(lián)系
使用Retrofit在App中進行網(wǎng)絡(luò)請求的過程中,首先App發(fā)出請求,然后Retrofit 通過注解配置請求參數(shù)、Header、url等,然后通過OkHttp發(fā)送網(wǎng)絡(luò)請求給服務(wù)器。

以上過程服務(wù)器返回響應(yīng)數(shù)據(jù)時,OkHttp將數(shù)據(jù)傳遞給Retrofit,再把數(shù)據(jù)直接傳遞給APP,然后可以進行刷新頁面數(shù)據(jù)等操作。

Retrofit和Okhttp的區(qū)別
OkHttp和Retrofit都是網(wǎng)絡(luò)開源框架,他們的區(qū)別是什么呢?

  1. Retrofit主要負責(zé)應(yīng)用層面的封裝,就是說主要面向開發(fā)者,方便使用,比如請求參數(shù),響應(yīng)數(shù)據(jù)的處理,錯誤處理等等。OkHttp主要負責(zé)socket部分的優(yōu)化,比如多路復(fù)用,buffer緩存,數(shù)據(jù)壓縮等等。
  2. Retrofit封裝了具體的請求,線程切換以及數(shù)據(jù)轉(zhuǎn)換。OkHttp 是基于Http協(xié)議封裝的一套請求客戶端,雖然它也可以開線程,但根本上它更偏向真正的請求,跟HttpClient, HttpUrlConnection的職責(zé)是一樣的。

為什么用Retrofit而不直接使用okhttp?
使用retrofit 主要是為了生成請求方便,okhttp 生成請求會有大量重復(fù)代碼,用retrofit使用注解可以方便的定義請求,然后自動生成這些重復(fù)的請求代碼。

Retrofit理解總結(jié)
retrofit 是一個基于okhttp的網(wǎng)絡(luò)訪問框架,網(wǎng)絡(luò)請求本質(zhì)上是okhttp完成的,retrofit 僅負責(zé)網(wǎng)絡(luò)請求接口的封裝。retrofit在請求接口中通過注解配置請求參數(shù)、Header、url等,Retrofit類似于一個網(wǎng)絡(luò)請求適配器,將一個基本的Java接口通過動態(tài)代理的方式翻譯成一個HTTP請求,并通過okhttp去發(fā)送請求。

Retrofit基本使用

在app下的build.gradle中加入以下庫就能使用Retrofit.

1、添加依賴庫

compile 'com.squareup.retrofit2:retrofit:2.1.0'

2、創(chuàng)建用于描述網(wǎng)絡(luò)請求的接口。

    @FormUrlEncoded
    @POST("user/edit.do")
    Observable<BaseResult> editAvatar(@Field("userImg") String userImg);

這是我項目中的一個請求接口,這里接口返回是一個Observable對象,是因為我是配合rxjava使用的,如果不使用rxjava配合應(yīng)該是返回一個Call對象。這部分下面再說。

3、創(chuàng)建 Retrofit 實例。

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("")
                .addConverterFactory(FastJsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .client(okHttpClient)
                .build();

4、創(chuàng)建網(wǎng)絡(luò)請求接口實例。
ClientApi是我創(chuàng)建的網(wǎng)絡(luò)請求接口

ClientApi clientApi = retrofit.create(ClientApi.class);

5、發(fā)送請求(基于rxjava的)

 HttpManager.getInstance().getApi().editAvatar("")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<BaseResult>() {
            @Override
            public void call(BaseResult baseResult) {
                
            }
        });

上述代碼中HttpManager.getInstance().getApi()得到的就是網(wǎng)絡(luò)請求接口的實例即上述clientApi 。

Retrofit的Converter和CallAdapter

Converter

使用Retrofit的時候會創(chuàng)建請求接口,內(nèi)部的方法返回值是Call<T>的格式。這里的T默認是ResponseBody,不過我們可以使用Converter這個功能把返回的數(shù)據(jù)解析成我們想要的樣子。即Converter是對于Call中T的轉(zhuǎn)換
一般情況下我們都使用GsonConverterFactory,當(dāng)請求到j(luò)son后,Retrofit就會調(diào)用GsonConverter將json轉(zhuǎn)成我們需要的實體。
使用GsonConverter需要添加庫

compile 'com.squareup.retrofit2:converter-gson:2.1.0'

然后在創(chuàng)建Retrofit對象的時候調(diào)用 :

.addConverterFactory(GsonConverterFactory.create())

當(dāng)然Converter可以自定義。

CallAdapter

Converter是對于Call中T的轉(zhuǎn)換,而CallAdapter則可以對Call轉(zhuǎn)換,這樣的話Call中的Call也是可以被替換的,而返回值的類型就決定你后續(xù)的處理程序邏輯,同樣Retrofit提供了多個CallAdapter。最受吹捧的就是rxjava.使用方式如下:

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

創(chuàng)建retrofit實例的時候加了這么一句就可以將描述網(wǎng)絡(luò)請求的接口中的方法的返回值變?yōu)镺bservable。這樣也就可以接著使用rxjava的鏈?zhǔn)浇Y(jié)構(gòu)訪問網(wǎng)絡(luò)了。

以上是我對Retrofit的一點總結(jié),其實也是參照各路大神的博客,把這些基礎(chǔ)的知識點放到一起方便理解而已。本篇博客在Retrofit的使用上說的不是很詳細,像注解的使用什么的都沒有涉及,其實我寫本篇的目的其實不是在使用上,主要就是前半部分的理解部分。希望能幫大家理解Retrofit,當(dāng)然也為了自己查閱方便。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容