Okhttp3是一個網絡請求庫箫柳。在介紹他的大多數文章中啥供,都有一句 很好很強大悯恍。那么這樣一個網絡請求庫怎么個強大呢伙狐?
那么要想知道他怎么個強大涮毫,就得知道他在各個問題上的處理方式
1、網絡連接的穩(wěn)定性贷屎,對于移動端來說,如果用戶處在一個網絡環(huán)境比較差的位置陶舞,那么數據的上傳和下載都會很慢。一旦網絡連接出錯舅巷,HttpUrlConnection 就會報錯钠右,但是Okhttp3可以配置椅文,是否重連,還可以更換訪問地址锨亏,尋找最終可以到達的網絡地址
2萌丈、傳輸的數據包大小英岭,在傳輸網絡數據時诅妹,一般的網絡請求都是直接將數據直接發(fā)送給服務器。但是Okhttp3 他默認使用的是GZIP,因為Okhttp3使用的是Okio(更加高效易用的IO庫)的IO流操作吭狡,自帶GZIP操作尖殃。先把數據壓縮一遍,然后再發(fā)送出去划煮,這樣就節(jié)省了我們的流量送丰,那么他能給我們節(jié)省多少流量呢?請看下圖
那么為啥使用GZIP也就清楚了弛秋,因為 壓縮速度快? 壓縮率高啊
有的時候器躏,有些用戶會反復刷新數據,其實對于后臺來說不停的重復請求數據蟹略,其實對后臺壓力蠻大的登失,這個時候,OkHttp3可以對網絡請求進行緩存挖炬,通過和后臺的最近修改時間做對比揽浙,看是否重新拉取數據,還是使用緩存數據意敛。這樣也節(jié)約了時間馅巷,也減少了額外流量的請求。
如果斷網了草姻,我們還可以使用緩存钓猬,正常的把數據給暫時出來
3、大量的網絡通道的處理碴倾,連接通道的復用逗噩,網絡請求都是比較耗時的,尤其是對于移動端跌榔,要http連接都是需要3次握手4次揮手的。如果每次請求過來都進行7次連接捶障,可想而知是有多耗性能僧须。而且一般移動端的請求網絡次數還是很多的。一般每秒也有2到3次網絡請求吧项炼。那么okhttp3會存在一個連接池担平,如果用完了的連接通道,會回到連接池锭部,便于下一次網絡請求使用暂论,這樣復用連接通道,就避免了反復的握手和揮手了拌禾。
但是同樣會有一個問題取胎,如果一瞬間有上百個網絡請求,那我是不是得不斷的去連接池請求網絡連接?這樣會不會增大內存的開銷闻蛀? 是的匪傍,當然會增加了。怎么辦呢觉痛? 當然是加一個連接池數量的限制嘛役衡?一般我們自己不會加,但是Okhttp3會自動幫我們加上
但是如果長時間不用網絡薪棒,我們還占用著與后臺的連接通道手蝎,那是不是也不太好呢?是的俐芯。所以如果一段時間不使用網絡棵介,連接通道也就會自動關閉了。這樣也就節(jié)省了性能開銷泼各。
想想如果上百次的網絡請求鞍时,那得和后臺進行多少次握手呀
4、開發(fā)人員如何管理網絡模塊扣蜻, 靈活性逆巍,Okhttp3 真的太靈活了,首先從他的配置方面來說莽使,1锐极、超時就分好幾種 比如 讀超時,寫超時芳肌,連接超時灵再,回調超時。
攔截器:Interceptors 亿笤,networdInterceptors翎迁,打個比方,網絡連接有的會出現(xiàn)重定向净薛,那么第一個只會攔截一次汪榔,但是第二個會在每一個重定向的時候攔截一次。
監(jiān)聽器:雖然監(jiān)聽器就那么一個接口肃拜,但是接口中會監(jiān)聽的網絡請求過程真的很多
每一個過程她都會回調一個監(jiān)聽方法
那么開始的方法和結束的方法永遠不變痴腌,都是callStart 和callEnd,那么這樣的話燃领,我們就能計算一個網絡請求的耗時情況了士聪。
但是有的時候,我又不想監(jiān)控所有網絡請求猛蔽,不要緊剥悟,我們還有EventFactory 可以進行選擇性攔截監(jiān)聽,不管是按百分比監(jiān)聽,還是按接口名來監(jiān)聽懦胞,通通滿足
請求體數據類型多樣:字符串請求體(最大1mb)替久,使用okio的IO流數據(數據大小不限),請求體為文件類型躏尉,表單數據請求體蚯根,multipart多種表單數據類型的上傳(可包含k/v數據,以及圖片等)適應各種類型的數據
網絡請求的控制能力胀糜,啥時候想取消就啥時候調用 call.cancel()方法 即可颅拦,這個一般用于頁面銷毀時,頁面級別的請求就得同步銷毀掉
靈活性相關的內容教藻,大家可以參考:Recipes - OkHttp
http距帅、https、http/2 都已支持括堤。
5碌秸、安全性? https的網絡連接方式,各種證書的配置,一般情況下使用Okhttp3默認的配置即可悄窃,如果對安全要求比較高的話讥电,可以自定義配置證書,但是這個得聯(lián)系服務器的證書管理員轧抗。
基本上這就是Okhttp3的強大的幾個點了恩敌。大致已經包括了網絡請求的各個關鍵點的問題。比如:網絡不穩(wěn)定的問題横媚、節(jié)省數據流量纠炮、網絡性能的開銷、開發(fā)人員對網絡的控制力灯蝴,網絡安全等恢口。基本上所列舉的這幾個點也是所有網絡請求都會遇到的問題穷躁。不管是volley還是HttpUrlConnection 都會遇到弧蝇,只是他們沒有如Okhttp3這樣考慮的這么細致。
目前Okhttp3已經更新到4.x了折砸,對于新版本的網絡請求,仍然沿用 Okhttp3的名字沙峻,畢竟大家已經熟悉了Okhttp3了睦授。