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ū)別是什么呢?
- Retrofit主要負責(zé)應(yīng)用層面的封裝,就是說主要面向開發(fā)者,方便使用,比如請求參數(shù),響應(yīng)數(shù)據(jù)的處理,錯誤處理等等。OkHttp主要負責(zé)socket部分的優(yōu)化,比如多路復(fù)用,buffer緩存,數(shù)據(jù)壓縮等等。
- 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)然也為了自己查閱方便。