Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android4種網絡連接方式HttpClient、HttpURLConnection、OKHttp和Volley優缺點和性能對比

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

編輯:關於Android編程

比較的指標:

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


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved