天天看點

Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比

大緻用過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占用

誤差說明:第三方軟體計算,受背景應用影響,存在一定誤差。

Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比
Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比

結論:測試機型總體上CPU占用率,OkHttp的網絡請求略低于其它聯網方式。

2、記憶體消耗

誤差說明:第三方軟體計算,受背景應用影響,存在一定誤差。

Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比
Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比
Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比

結論:測試機型總體上記憶體占用情況,在小米手機上,OkHttp的網絡請求消耗記憶體略低于其它聯網方式。在魅族手機上,記憶體消耗略高于其它方式。顯示出測試機型記憶體消耗表現不一。

3、電量消耗

誤差說明:第三方軟體計算,受背景應用影響,存在一定誤差。

Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比
Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比
Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比

結論:OkHttp的網絡請求消耗的電量百分比在略低于其它聯網方式,消耗的總電量在小米手機上高于其它聯網方式,在魅族手機上略低于其它聯網方式。消耗電量的差異不大,在0.5mah以内。

4、流量消耗

誤差說明:網絡請求的發送和接收流量存在一定誤差。

Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比
Android4種網絡連接配接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比

結論:

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

繼續閱讀