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

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

比較的指標:

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.1 5.0
4種網絡連接方式提供的功能對比表格:

| Tables | 緩存 | 重試 | Https/Http | 穩定性 |Cookie | Session |
| ------------- |:-------------:| -----:|------------- |:-------------:| -----:|:-------------:| -----:|
| HttpClient | √ | √ |√ | Ok | √ 自動管理Cookie |√ |
| HttpURLConnection | POST×; GET √ 4.0以后 | √ |√ | Ok | √ 設置請求Cookie |√ |
| OkHttp | √ | √ |√ | Ok | √ |√ |
| Volley | √ | √ |√ | Ok | √ 自動管理Cookie |√ |

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。

功能對比表格參考的博客:
HttpClient Cookie:
http://zzc1684.iteye.com/blog/2162858

HttpClient 重試機制:
http://blog.csdn.net/weborn/article/details/9112309

Volley源碼解析:
http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2542

HttpURLConnection設置請求Cookie:
http://hw1287789687.iteye.com/blog/2240085

OkHttp Cookie管理:
https://segmentfault.com/a/1190000004345545

Volley CookieSession:
http://my.oschina.net/liusicong/blog/361853

HttpClient Session保持:
http://www.flysnow.org/2013/11/21/android-httpclitent-session-keep.html

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/SPDYSPDY(發音如英語: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的基本用法,網上資料無數,這里推薦郭霖大神的博客 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 Http stack作為其傳輸層,在Gingerbread及之后的版本上使用HttpURLConnection stack作為傳輸層。原因是在不同的安卓版本中這兩種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地址

參考博客:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html
http://blog.csdn.net/zhangcanyan/article/details/51661448
一、性能指標對比
測試手機:小米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平均比前者高10ms20ms,OkHttp比Volley高20ms40ms。

綜上得出最終結論:
1、對于新的應用程序,應該更加偏向于使用HttpURLConnection因為在以后的工作當中Google也會將更多的時間放在優化HttpURLConnection上面。
谷歌自己也是推薦用HttpUrlConnection,對它進行了大量的優化,這個從安卓的幫助文檔可以看出來:
http://developer.android.com/reference/java/net/HttpURLConnection.html

2、對于已經成熟的應用, Volley停止了更新,而OkHttp得到了官方的認可,并在不斷優化。
**因此我建議使用OkHttp,現在最新穩定版為3.2.0 **

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容