大緻用過HttpClient、HttpURLConnection、OKHttp,找到一篇總結很好的文章來分享一下。
轉自:http://www.2cto.com/kf/201607/521798.html
比較的名額:
1、cpu
2、流量
3、電量
4、記憶體占用
5、聯網時間
功能點:
1、重試機制
2、提供的擴充功能
3、易用性
4、是否https
5、是否支援reflect api,OkHttp有配套方法
6、緩存、重試
7、cookie支援session id會話支援
8、弱網性能和穩定性
9、逾時時間,幾種逾時時間 連接配接逾時,響應逾時
10、适配各種機型、4.4和之前版本 2.3 4.15.0
4種網絡連接配接方式提供的功能對比表格:
緩存 | 重試 | Https/Http | 穩定性 | Cookie | Session | |
HttpClient | √ | √ | √ | Ok | √ 自動管理Cookie | √ |
HttpURLConnection | POST × GET √ 4.0以後 | √ | √ | Ok | √ 設定請求Cookie | √ |
OkHttp | √ | √ | √ | Ok | √ | √ |
Volley | √ | √ | √ | Ok | √ | √ |
Ps:穩定性:四種網絡連接配接方式都在業内廣泛應用,都比較穩定。
特别指出的是,在 Froyo(2.2)之前,HttpURLConnection有個重大 Bug,調用close()函數會影響連接配接池,導緻連接配接複用失效,是以在 Froyo 之前使用HttpURLConnection需要關閉keepAlive。
另外,在 Gingerbread(2.3) HttpURLConnection 預設開啟了 gzip 壓縮,提高了 HTTPS 的性能,Ice Cream Sandwich(4.0) HttpURLConnection 支援了請求結果緩存。
再加上HttpURLConnection本身API相對簡單,是以對Android來說,在2.3之後建議使用HttpURLConnection,之前建議使用HttpClient。
1、HttpClient 缺點羅列
Apache HttpClient早就不推薦httpclient,5.0之後幹脆廢棄,後續會删除。6.0删除了HttpClient。Java開發用HttpClient,官方推薦Android開發用HttpUrlConnection。
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實作類,它們都擁有衆多的API,而且實作比較穩定,bug數量也很少。
但同時也由于HttpClient的API數量過多,使得我們很難在不破壞相容性的情況下對它進行更新和擴充,是以,目前Android團隊在提升和優化HttpClient方面的工作态度并不積極。
高效穩定,但是維護成本高昂,故android 開發團隊不願意在維護該庫而是轉投更為輕便的HttpUrlConnection。
2、HttpURLConnection
HttpURLConnection是一種多用途、輕量極的HTTP用戶端,使用它來進行HTTP操作可以适用于大多數的應用程式。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴充它。
不過在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厭煩的bug。比如說對一個可讀的InputStream調用close()方法時,就有可能會導緻連接配接池失效了。那麼我們通常的解決辦法就是直接禁用掉連接配接池的功能:
在Android 4.0版本中,我們又添加了一些響應的緩存機制。當緩存被安裝後(調用HttpResponseCache的install()方法),所有的HTTP請求都會滿足以下三種情況:
比較輕便,靈活,易于擴充
在3.0後以及4.0中都進行了改善,如對HTTPS的支援
在4.0中,還增加了對緩存的支援
在android 2.2及以下版本中HttpUrlConnection存在着一些bug,是以建議在android 2.3以後使用HttpUrlConnection,2.3之前使用HttpClient。
3、OkHttp優點較多
OkHttp是一個現代,快速,高效的Http client,支援HTTP/2以及SPDY(SPDY介紹網址:https://zh.wikipedia.org/wiki/SPDY,SPDY(發音如英語:speedy),一種開放的網絡傳輸協定,由Google開發),它為你做了很多的事情。
OKHttp是Android版Http用戶端。非常高效,支援SPDY、連接配接池、GZIP和HTTP緩存。
支援SPDY,可以合并多個到同一個主機的請求
OkHttp實作的諸多技術如:連接配接池,gziping,緩存等就知道網絡相關的操作是多麼複雜了。
OkHttp扮演着傳輸層的角色。
OkHttp使用Okio來大大簡化資料的通路與存儲,Okio是一個增強 java.io 和 java.nio的庫。
OkHttp 處理了很多網絡疑難雜症:會從很多常用的連接配接問題中自動恢複。如果您的伺服器配置了多個IP位址,當第一個IP連接配接失敗的時候,OkHttp會自動嘗試下一個IP。
OkHttp還處理了代理伺服器問題和SSL握手失敗問題。
OkHttp是一個Java的HTTP+SPDY用戶端開發包,同時也支援Android。需要Android 2.3以上
OKHttp是Android版Http用戶端。非常高效,支援SPDY、連接配接池、GZIP和 HTTP 緩存。
預設情況下,OKHttp會自動處理常見的網絡問題,像二次連接配接、SSL的握手問題。
如果你的應用程式中內建了OKHttp,Retrofit預設會使用OKHttp處理其他網絡層請求。
從Android4.4開始HttpURLConnection的底層實作采用的是okHttp
緩存響應避免重複的網絡請求
目前,該封裝庫志支援:
? 一般的get請求
? 一般的post請求
? 基于Http的檔案上傳
? 檔案下載下傳
? 上傳下載下傳的進度回調
? 加載圖檔
? 支援請求回調,直接傳回對象、對象集合
? 支援session的保持
? 支援自簽名網站https的通路,提供方法設定下證書就行
? 支援取消某個請求
為什麼要做緩存,或者說有什麼好處?
減少伺服器負荷,降低延遲提升使用者體驗。
複雜的緩存政策會根據使用者目前的網絡情況采取不同的緩存政策,比如在2g網絡很差的情況下,提高緩存使用的時間;不用的應用、業務需求、接口所需要的緩存政策也會不一樣,有的要保證資料的實時性,是以不能有緩存,有的你可以緩存5分鐘,等等。你要根據具體情況所需資料的時效性情況給出不同的方案。當然你也可以全部都一樣的緩存政策,看你自己。
4、Volley
Volley是一個簡化網絡任務的庫。他負責處理請求,加載,緩存,線程,同步等問題。它可以處理JSON,圖檔,緩存,文本源,支援一定程度的自定義。
Volley在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。
Volley存在一個緩存線程,一個網絡請求線程池(預設4個線程)。
Volley這樣直接用開發效率會比較低,我将我使用Volley時的各種技巧封裝成了一個庫RequestVolly.
我在這個庫中将構造請求的方式封裝為了函數式調用。維持一個全局的請求隊列,拓展一些友善的API。
不過再怎麼封裝Volley在功能拓展性上始終無法與OkHttp相比。
Volley停止了更新,而OkHttp得到了官方的認可,并在不斷優化。
是以我最終替換為了OkHttp
OkHttp使用Okio進行資料傳輸。都是Square家的。
但并不是直接用OkHttp。Square公司還出了一個Retrofit庫配合OkHttp戰鬥力翻倍。
網絡加載庫:Picasso、Fresco,是以我更喜歡Glide
不過現在主流的網絡請求都是用Volley,OkHttp呼聲也很高。
Volley是為RPC網絡操作而設計的,适用于短時操作。
Volley預設在Froyo上使用Apache Httpstack作為其傳輸層,在Gingerbread及之後的版本上使用HttpURLConnectionstack作為傳輸層。原因是在不同的安卓版本中這兩種http stack各自存在一些問題。
Volley可以輕松設定OkHttp作為其傳輸層。
Volley是谷歌開發的。
Volley可以說是把AsyncHttpClient和Universal-Image-Loader的優點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網絡上的圖檔。除了簡單易用之外,Volley在性能方面也進行了大幅度的調整,它的設計目标就是非常适合去進行資料量不大,但通信頻繁的網絡操作,而對于大資料量的網絡操作,比如說下載下傳檔案等,Volley的表現就會非常糟糕
Volley提供了:JsonObjectRequest、JsonArrayRequest、StringRequest、ImageRequest、NetworkImageView等Request形式。
Volley的優點很多,可拓展、結構合理、邏輯清晰、能識别緩存、通過統一的方式,擷取網絡資料,包括且不限于文本、圖檔等資源。用了一段時間,果斷放棄以前用過的其他架構。
Volley在一開始建立請求隊列的過程中,需要建立網絡線程和緩存線程,同時還需要初始化基于Disk的緩存,這中間有大量的資源開銷和IO操作,所有才會慢。
4種方式的比較:
1、HttpClient: 在Android 2.2版本之前,HttpClient擁有較少的bug,是以使用它是最好的選擇。
2、HttpURlConnection: 而在Android 2.3版本及以後,HttpURLConnection則是最佳的選擇。它的API簡單,體積較小,因而非常适用于Android項目。
對于新的應用程式應該更加偏向于使用HttpURLConnection,因為在以後的工作當中我們也會将更多的時間放在優化HttpURLConnection上面。
谷歌自己也是推薦用HttpUrlConnection,對它進行了大量的優化,這個從安卓的幫助文檔可以看出來:
http://developer.android.com/reference/java/net/HttpURLConnection.html
3、OkHttp:是一個相對成熟的解決方案,我們更有理由相信OkHttp的強大。
Android4.4的源碼中可以看到HttpURLConnection已經替換成OkHttp實作了。
OkHttp 處理了很多網絡疑難雜症:會從很多常用的連接配接問題中自動恢複。
如果您的伺服器配置了多個IP位址,當第一個IP連接配接失敗的時候,OkHttp會自動嘗試下一個IP。
OkHttp還處理了代理伺服器問題和SSL握手失敗問題。
使用 OkHttp 無需重寫您程式中的網絡代碼。
OkHttp實作了幾乎和java.net.HttpURLConnection一樣的API。
其實作在嘛,兩者都不用,就用
Okhttp
HttpUrlConnection現在的底層實作就是通過Okhttp
網絡請求架構支援的功能:
1、支援自定義請求的Header
2、支援Http的基本請求方法:GET、POST
3、支援檔案上傳和下載下傳
4、可以加載圖檔
5、支援多任務網絡請求操做
6、支援緩存
7、支援請求回調
8、支援session的保持
網絡優化建議點:
1、連接配接複用節省連接配接建立時間,如開啟keep-alive
2、不用域名,用IP直連省去DNS解析過程,根據域名得到IP位址
一、性能名額對比
測試手機:小米MI3(4.4.4)、魅藍2(5.1)
測試版本:書旗Android 9.9.0
測試環境:直連下wifi通路
測試方法:安裝并開啟易測APP,安裝網絡架構apk,進行聯網請求(http://www.csdn.net/),請求多次進行測試。
測試結果計算:測試3次。
誤差說明:第三方軟體計算,受背景應用影響,存在一定誤差。
1、CPU占用
誤差說明:第三方軟體計算,受背景應用影響,存在一定誤差。


結論:測試機型總體上CPU占用率,OkHttp的網絡請求略低于其它聯網方式。
2、記憶體消耗
誤差說明:第三方軟體計算,受背景應用影響,存在一定誤差。



結論:測試機型總體上記憶體占用情況,在小米手機上,OkHttp的網絡請求消耗記憶體略低于其它聯網方式。在魅族手機上,記憶體消耗略高于其它方式。顯示出測試機型記憶體消耗表現不一。
3、電量消耗
誤差說明:第三方軟體計算,受背景應用影響,存在一定誤差。



結論:OkHttp的網絡請求消耗的電量百分比在略低于其它聯網方式,消耗的總電量在小米手機上高于其它聯網方式,在魅族手機上略低于其它聯網方式。消耗電量的差異不大,在0.5mah以内。
4、流量消耗
誤差說明:網絡請求的發送和接收流量存在一定誤差。


結論:
1、網絡發送流量HttpURLConnection最高,Volley次之,OKHttp第三位,HttpClient最少。但是,資料量差别不大,零點幾的請求差别。
2、累積接收流量HttpClient最大,HttpURLConnection和Volley相同,OkHttp略大于前兩者。
5、聯網平均耗時
誤差說明:網絡的狀況可能會影響網絡請求時間。
結論:網絡請求平均耗時HttpClient最大,HttpURLConnection最小,Volley平均比前者高10ms~20ms,OkHttp比Volley高20ms~40ms。
綜上得出最終結論:
1、對于新的應用程式,應該更加偏向于使用HttpURLConnection,因為在以後的工作當中Google也會将更多的時間放在優化HttpURLConnection上面。
谷歌自己也是推薦用HttpUrlConnection,對它進行了大量的優化,這個從安卓的幫助文檔可以看出來:
http://developer.android.com/reference/java/net/HttpURLConnection.html
2、對于已經成熟的應用, Volley停止了更新,而OkHttp得到了官方的認可,并在不斷優化。
是以我建議使用OkHttp,現在最新穩定版為3.2.0