一.OkHttp
OkHttp是Square開源的輕量級框架,是一款現(xiàn)代、高效、快速的Android版Http client。
1.OkHttp特性:
它的設(shè)計和實現(xiàn)的首要目標(biāo)便是高效,有如下特性:
??支持SPDY、連接池、Gzip和Http緩存(記住第一條可直接推及記起下面四條,感覺萌萌噠^_^);
??支持SPDY,因此可以同一IP多個連接共享同一個socket(SPDY并不是一種用于替代HTTP的協(xié)議,而是對HTTP協(xié)議的增強,具體請自行百度);
??在Http/2不可用時, 連接池可極大減少延時;
??支持Gzip壓縮響應(yīng)體,降低傳輸內(nèi)容的大小;
??支持Http緩存,避免重復(fù)請求;
??服務(wù)器配置多IP情況下,當(dāng)前IP請求失敗,支持自動切換到其他IP;
??使用Okio來簡化數(shù)據(jù)的訪問與存儲,提高性能;
??OkHttp還處理了代理服務(wù)器問題和SSL握手失敗問題;
2.OkHttp使用
OkHttp主要支持以下使用方式(記住多少算多少吧):
? 異步get請求;
??異步post請求;
??異步文件上傳;
??異步文件下載;
??異步上傳Multipart文件;(多種類型文件合在一起,同一個請求上傳)
??上傳下載的進度回調(diào);
?? 加載圖片;
?? 支持請求回調(diào),直接返回對象、對象集合;
?? 支持session的保持;
?? 支持自簽名網(wǎng)站https的訪問,提供方法設(shè)置下證書就行;
?? 支持取消某個請求;
3.OkHttp流程圖
為了幫助記憶,留下Okhttp請求流程圖(用于忽悠人):

4. OkHttp的缺點
???是消息回來需要切到主線程,主線程要自己去寫。
???調(diào)用比較復(fù)雜,需要自己進行封裝。
???緩存失效:網(wǎng)絡(luò)請求時一般都會獲取手機的一些硬件或網(wǎng)絡(luò)信息,比如使用的網(wǎng)絡(luò)環(huán)境。同時為了信息傳輸?shù)陌踩?,可能還會對請求進行加密。在這些情況下OkHttp的緩存系統(tǒng)就會失效了,導(dǎo)致用戶在無網(wǎng)絡(luò)情況下不能訪問緩存。
緩存失效解決方案:先過濾可變參數(shù),然后進行手動緩存;不要使用隨網(wǎng)絡(luò)狀態(tài)變化的參數(shù);
參見微博:OkHttp緩存失效
二 Retrofit
Retrofit是Square開源的一款適用于Android網(wǎng)絡(luò)請求的框架。Retrofit底層是基于OkHttp實現(xiàn)的,與其他網(wǎng)絡(luò)框架不同的是,它更多使用運行時注解的方式提供功能。
1.Retrofit優(yōu)缺點
優(yōu)點:
?? 可以配置不同HTTP client來實現(xiàn)網(wǎng)絡(luò)請求,如okhttp、httpclient等;
?? 請求的方法參數(shù)注解都可以定制;
?? 支持同步、異步和RxJava;
?? 超級解耦;
?? 可以配置不同的反序列化工具來解析數(shù)據(jù),如json、xml等;
?? 使用非常方便靈活;
?? 框架使用了很多設(shè)計模式(感興趣的可以看看源碼學(xué)習(xí)學(xué)習(xí));
附加Stay大神整理的retrofit源碼流程圖:

缺點:
?? 不能接觸序列化實體和響應(yīng)數(shù)據(jù);
?? 執(zhí)行的機制太嚴(yán)格;
?? 使用轉(zhuǎn)換器比較低效;
?? 只能支持簡單自定義參數(shù)類型;
2.Retrofit注解
Retrofit注解分為三大類,分別是HTTP請求方法注解(8種)、標(biāo)記類注解(3種)和參數(shù)類注解(11種)。
??HTTP請求方法注解:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、HTTP
??標(biāo)記類注解:FormUrlEncoded、Multipart、Streaming
??參數(shù)類注解:Headers、Header、Body、Field、FieldMap、Part、PartMap、Path、Query、QueryMap、Url
至于具體注解的使用和實例,請看這篇博文吧:Retrofit2完全教程
三.OkHttp和Retrofit的聯(lián)系
Retrofit底層對網(wǎng)絡(luò)的訪問默認(rèn)是基于okhttp,不過Retrofit非常適合于restful url格式的請求,更多使用注解的方式提供功能,下面這個網(wǎng)絡(luò)請求流程圖,可以更直觀的理解OkHttp和Retrofit的關(guān)系。

網(wǎng)絡(luò)請求:APP發(fā)起網(wǎng)絡(luò)請求,Retrofit通過注解配置請求參數(shù)、Header、Url之后,通過OkHttp發(fā)生網(wǎng)絡(luò)請求給服務(wù)器。
服務(wù)器響應(yīng):服務(wù)器返回響應(yīng)數(shù)據(jù),OkHttp將數(shù)據(jù)傳遞給Retrofit,再把數(shù)據(jù)直接傳遞給APP,界面刷新反饋結(jié)果給用戶。
OkHttp和Retrofit都是網(wǎng)絡(luò)開源框架,但是他們之間的區(qū)別請不要混淆:
職責(zé)不同:
??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é)是一樣的。
另外,網(wǎng)上一般都推薦RxJava+Retrofit+OkHttp框架,Retrofit負責(zé)請求的數(shù)據(jù)和請求的結(jié)果,使用接口的方式呈現(xiàn),OkHttp負責(zé)請求的過程,RxJava負責(zé)異步,各種線程之間的切換,用起來炒雞爽。
四.一些建議
由于這兩個框架是這周開始接觸的,根本沒時間去嘗試寫demo測試,直接看了《Android進階之光》的框架篇和網(wǎng)上的一些資料,其實一頭懵逼。只是表面上懂一點點皮毛,建議大家可以嘗試去了解應(yīng)用場景,嘗試在項目中或者自己寫個demo去實踐一下,然后再去看源碼,先理清楚具體調(diào)用流程,再根據(jù)優(yōu)點和特性,看框架源碼的具體實現(xiàn)。
參考資料:
《Android進階之光》