轉(zhuǎn)自: Android4種網(wǎng)絡(luò)連接方式HttpClient、HttpURLConnection奥邮、OKHttp和Volley優(yōu)缺點和性能對比
比較的指標:
1万牺、cpu
2、流量
3洽腺、電量
4脚粟、內(nèi)存占用
5、聯(lián)網(wǎng)時間
功能點:
1蘸朋、重試機制
2核无、提供的擴展功能
3、易用性
4藕坯、是否https
5团南、是否支持reflect api,OkHttp有配套方法
6炼彪、緩存吐根、重試
7、cookie支持session id會話支持
8辐马、弱網(wǎng)性能和穩(wěn)定性
9拷橘、超時時間,幾種超時時間 連接超時喜爷,響應(yīng)超時
10膜楷、適配各種機型、4.4和之前版本 2.3 4.1 5.0
4種網(wǎng)絡(luò)連接方式提供的功能對比表格:
| Tables | 緩存 | 重試 | Https/Http | 穩(wěn)定性 |Cookie | Session |
| ------------- |:-------------:| -----:|------------- |:-------------:| -----:|:-------------:| -----:|
| HttpClient | √ | √ |√ | Ok | √ 自動管理Cookie |√ |
| HttpURLConnection | POST×; GET √ 4.0以后 | √ |√ | Ok | √ 設(shè)置請求Cookie |√ |
| OkHttp | √ | √ |√ | Ok | √ |√ |
| Volley | √ | √ |√ | Ok | √ 自動管理Cookie |√ |
Ps:穩(wěn)定性:四種網(wǎng)絡(luò)連接方式都在業(yè)內(nèi)廣泛應(yīng)用贞奋,都比較穩(wěn)定。
特別指出的是穷绵,在 Froyo(2.2)之前轿塔,HttpURLConnection有個重大 Bug,調(diào)用close()函數(shù)會影響連接池,導(dǎo)致連接復(fù)用失效勾缭,所以在 Froyo 之前使用HttpURLConnection需要關(guān)閉keepAlive揍障。
另外,在 Gingerbread(2.3) HttpURLConnection 默認開啟了 gzip 壓縮俩由,提高了 HTTPS 的性能毒嫡,Ice Cream Sandwich(4.0) HttpURLConnection 支持了請求結(jié)果緩存。
再加上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設(shè)置請求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之后干脆廢棄煞躬,后續(xù)會刪除肛鹏。6.0刪除了HttpClient。Java開發(fā)用HttpClient恩沛,官方推薦Android開發(fā)用HttpUrlConnection在扰。
DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具體的實現(xiàn)類,它們都擁有眾多的API雷客,而且實現(xiàn)比較穩(wěn)定芒珠,bug數(shù)量也很少。
但同時也由于HttpClient的API數(shù)量過多佛纫,使得我們很難在不破壞兼容性的情況下對它進行升級和擴展妓局,所以,目前Android團隊在提升和優(yōu)化HttpClient方面的工作態(tài)度并不積極呈宇。
高效穩(wěn)定好爬,但是維護成本高昂,故android 開發(fā)團隊不愿意在維護該庫而是轉(zhuǎn)投更為輕便的HttpUrlConnection甥啄。
2存炮、HttpURLConnection
HttpURLConnection是一種多用途、輕量極的HTTP客戶端蜈漓,使用它來進行HTTP操作可以適用于大多數(shù)的應(yīng)用程序穆桂。雖然HttpURLConnection的API提供的比較簡單,但是同時這也使得我們可以更加容易地去使用和擴展它融虽。
不過在Android 2.2版本之前享完,HttpURLConnection一直存在著一些令人厭煩的bug。比如說對一個可讀的InputStream調(diào)用close()方法時有额,就有可能會導(dǎo)致連接池失效了般又。那么我們通常的解決辦法就是直接禁用掉連接池的功能:
在Android 4.0版本中彼绷,我們又添加了一些響應(yīng)的緩存機制。當緩存被安裝后(調(diào)用HttpResponseCache的install()方法),所有的HTTP請求都會滿足以下三種情況:
比較輕便,靈活骤公,易于擴展
在3.0后以及4.0中都進行了改善,如對HTTPS的支持
在4.0中猜旬,還增加了對緩存的支持
在android 2.2及以下版本中HttpUrlConnection存在著一些bug,所以建議在android 2.3以后使用HttpUrlConnection倦卖,2.3之前使用HttpClient洒擦。
3、OkHttp優(yōu)點較多
OkHttp是一個現(xiàn)代糖耸,快速秘遏,高效的Http client,支持HTTP/2以及SPDY(SPDY介紹網(wǎng)址:https://zh.wikipedia.org/wiki/SPDY嘉竟,SPDY(發(fā)音如英語:speedy)邦危,一種開放的網(wǎng)絡(luò)傳輸協(xié)議,由Google開發(fā))舍扰,它為你做了很多的事情倦蚪。
OKHttp是Android版Http客戶端。非常高效边苹,支持SPDY陵且、連接池、GZIP和HTTP緩存个束。
支持SPDY慕购,可以合并多個到同一個主機的請求
OkHttp實現(xiàn)的諸多技術(shù)如:連接池,gziping茬底,緩存等就知道網(wǎng)絡(luò)相關(guān)的操作是多么復(fù)雜了沪悲。
OkHttp扮演著傳輸層的角色。
OkHttp使用Okio來大大簡化數(shù)據(jù)的訪問與存儲阱表,Okio是一個增強 java.io 和 java.nio的庫殿如。
OkHttp 處理了很多網(wǎng)絡(luò)疑難雜癥:會從很多常用的連接問題中自動恢復(fù)。如果您的服務(wù)器配置了多個IP地址最爬,當?shù)谝粋€IP連接失敗的時候涉馁,OkHttp會自動嘗試下一個IP。
OkHttp還處理了代理服務(wù)器問題和SSL握手失敗問題爱致。
OkHttp是一個Java的HTTP+SPDY客戶端開發(fā)包烤送,同時也支持Android。需要Android 2.3以上
OKHttp是Android版Http客戶端糠悯。非常高效帮坚,支持SPDY牢裳、連接池、GZIP和 HTTP 緩存叶沛。
默認情況下,OKHttp會自動處理常見的網(wǎng)絡(luò)問題忘朝,像二次連接灰署、SSL的握手問題。
如果你的應(yīng)用程序中集成了OKHttp局嘁,Retrofit默認會使用OKHttp處理其他網(wǎng)絡(luò)層請求溉箕。
從Android4.4開始HttpURLConnection的底層實現(xiàn)采用的是okHttp
緩存響應(yīng)避免重復(fù)的網(wǎng)絡(luò)請求
目前,該封裝庫志支持:
? 一般的get請求
? 一般的post請求
? 基于Http的文件上傳
? 文件下載
? 上傳下載的進度回調(diào)
? 加載圖片
? 支持請求回調(diào)悦昵,直接返回對象肴茄、對象集合
? 支持session的保持
? 支持自簽名網(wǎng)站https的訪問,提供方法設(shè)置下證書就行
? 支持取消某個請求
為什么要做緩存但指,或者說有什么好處寡痰?
減少服務(wù)器負荷,降低延遲提升用戶體驗棋凳。
復(fù)雜的緩存策略會根據(jù)用戶當前的網(wǎng)絡(luò)情況采取不同的緩存策略拦坠,比如在2g網(wǎng)絡(luò)很差的情況下,提高緩存使用的時間剩岳;不用的應(yīng)用贞滨、業(yè)務(wù)需求、接口所需要的緩存策略也會不一樣拍棕,有的要保證數(shù)據(jù)的實時性晓铆,所以不能有緩存,有的你可以緩存5分鐘绰播,等等骄噪。你要根據(jù)具體情況所需數(shù)據(jù)的時效性情況給出不同的方案。當然你也可以全部都一樣的緩存策略幅垮,看你自己腰池。
4、Volley
Volley是一個簡化網(wǎng)絡(luò)任務(wù)的庫忙芒。他負責處理請求示弓,加載,緩存呵萨,線程奏属,同步等問題。它可以處理JSON潮峦,圖片囱皿,緩存勇婴,文本源,支持一定程度的自定義嘱腥。
Volley在Android 2.3及以上版本耕渴,使用的是HttpURLConnection,而在Android 2.2及以下版本齿兔,使用的是HttpClient橱脸。 Volley的基本用法,網(wǎng)上資料無數(shù)分苇,這里推薦郭霖大神的博客 Volley存在一個緩存線程添诉,一個網(wǎng)絡(luò)請求線程池(默認4個線程)。 Volley這樣直接用開發(fā)效率會比較低医寿,我將我使用Volley時的各種技巧封裝成了一個庫RequestVolly. 我在這個庫中將構(gòu)造請求的方式封裝為了函數(shù)式調(diào)用栏赴。維持一個全局的請求隊列,拓展一些方便的API靖秩。
不過再怎么封裝Volley在功能拓展性上始終無法與OkHttp相比须眷。Volley停止了更新,而OkHttp得到了官方的認可盆偿,并在不斷優(yōu)化柒爸。因此我最終替換為了OkHttp
OkHttp使用Okio進行數(shù)據(jù)傳輸。都是Square家的事扭。但并不是直接用OkHttp捎稚。Square公司還出了一個Retrofit庫配合OkHttp戰(zhàn)斗力翻倍。
網(wǎng)絡(luò)加載庫:Picasso求橄、Fresco今野,所以我更喜歡Glide
不過現(xiàn)在主流的網(wǎng)絡(luò)請求都是用Volley,OkHttp呼聲也很高罐农。
Volley是為RPC網(wǎng)絡(luò)操作而設(shè)計的条霜,適用于短時操作。
Volley默認在Froyo上使用Apache Http stack作為其傳輸層涵亏,在Gingerbread及之后的版本上使用HttpURLConnection stack作為傳輸層宰睡。原因是在不同的安卓版本中這兩種http stack各自存在一些問題。
Volley可以輕松設(shè)置OkHttp作為其傳輸層气筋。
Volley是谷歌開發(fā)的拆内。
Volley可以說是把AsyncHttpClient和Universal-Image-Loader的優(yōu)點集于了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信宠默,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片麸恍。除了簡單易用之外,Volley在性能方面也進行了大幅度的調(diào)整,它的設(shè)計目標就是非常適合去進行數(shù)據(jù)量不大抹沪,但通信頻繁的網(wǎng)絡(luò)操作刻肄,而對于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如說下載文件等融欧,Volley的表現(xiàn)就會非常糟糕 Volley提供了:JsonObjectRequest敏弃、JsonArrayRequest、StringRequest噪馏、ImageRequest权她、NetworkImageView等Request形式。
Volley的優(yōu)點很多逝薪,可拓展、結(jié)構(gòu)合理蝴罪、邏輯清晰董济、能識別緩存、通過統(tǒng)一的方式要门,獲取網(wǎng)絡(luò)數(shù)據(jù)虏肾,包括且不限于文本、圖片等資源欢搜。用了一段時間封豪,果斷放棄以前用過的其他框架。
Volley在一開始創(chuàng)建請求隊列的過程中炒瘟,需要創(chuàng)建網(wǎng)絡(luò)線程和緩存線程吹埠,同時還需要初始化基于Disk的緩存,這中間有大量的資源開銷和IO操作疮装,所有才會慢缘琅。
4種方式的比較:
**1、HttpClient: **在Android 2.2版本之前廓推,HttpClient擁有較少的bug刷袍,因此使用它是最好的選擇。
2樊展、HttpURlConnection: 而在Android 2.3版本及以后呻纹,HttpURLConnection則是最佳的選擇。它的API簡單专缠,體積較小雷酪,因而非常適用于Android項目。
對于新的應(yīng)用程序應(yīng)該更加偏向于使用HttpURLConnection藤肢,因為在以后的工作當中我們也會將更多的時間放在優(yōu)化HttpURLConnection上面太闺。
谷歌自己也是推薦用HttpUrlConnection,對它進行了大量的優(yōu)化嘁圈,這個從安卓的幫助文檔可以看出來:
http://developer.android.com/reference/java/net/HttpURLConnection.html
3省骂、OkHttp:是一個相對成熟的解決方案蟀淮,我們更有理由相信OkHttp的強大。
Android4.4的源碼中可以看到HttpURLConnection已經(jīng)替換成OkHttp實現(xiàn)了钞澳。
OkHttp 處理了很多網(wǎng)絡(luò)疑難雜癥:會從很多常用的連接問題中自動恢復(fù)怠惶。
如果您的服務(wù)器配置了多個IP地址,當?shù)谝粋€IP連接失敗的時候轧粟,OkHttp會自動嘗試下一個IP策治。
OkHttp還處理了代理服務(wù)器問題和SSL握手失敗問題。
使用 OkHttp 無需重寫您程序中的網(wǎng)絡(luò)代碼兰吟。
OkHttp實現(xiàn)了幾乎和java.net.HttpURLConnection一樣的API通惫。
其實現(xiàn)在嘛,兩者都不用混蔼,就用Okhttp
HttpUrlConnection現(xiàn)在的底層實現(xiàn)就是通過Okhttp
網(wǎng)絡(luò)請求框架支持的功能:
1履腋、支持自定義請求的Header
2、支持Http的基本請求方法:GET惭嚣、POST
3遵湖、支持文件上傳和下載
4、可以加載圖片
5晚吞、支持多任務(wù)網(wǎng)絡(luò)請求操做
6延旧、支持緩存
7、支持請求回調(diào)
8槽地、支持session的保持
網(wǎng)絡(luò)優(yōu)化建議點:
1迁沫、連接復(fù)用節(jié)省連接建立時間,如開啟keep-alive
2捌蚊、不用域名弯洗,用IP直連省去DNS解析過程,根據(jù)域名得到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
測試環(huán)境:直連下wifi訪問
測試方法:安裝并開啟易測APP,安裝網(wǎng)絡(luò)框架apk溺拱,進行聯(lián)網(wǎng)請求(http://www.csdn.net/)逃贝,請求多次進行測試。
測試結(jié)果計算:測試3次迫摔。
誤差說明:第三方軟件計算沐扳,受后臺應(yīng)用影響,存在一定誤差句占。
1沪摄、CPU占用
誤差說明:第三方軟件計算,受后臺應(yīng)用影響,存在一定誤差杨拐。
結(jié)論:測試機型總體上CPU占用率祈餐,OkHttp的網(wǎng)絡(luò)請求略低于其它聯(lián)網(wǎng)方式。
2哄陶、內(nèi)存消耗
誤差說明:第三方軟件計算帆阳,受后臺應(yīng)用影響,存在一定誤差屋吨。
結(jié)論:測試機型總體上內(nèi)存占用情況蜒谤,在小米手機上,OkHttp的網(wǎng)絡(luò)請求消耗內(nèi)存略低于其它聯(lián)網(wǎng)方式至扰。在魅族手機上鳍徽,內(nèi)存消耗略高于其它方式。顯示出測試機型內(nèi)存消耗表現(xiàn)不一敢课。
3旬盯、電量消耗
誤差說明:第三方軟件計算,受后臺應(yīng)用影響翎猛,存在一定誤差。
結(jié)論:OkHttp的網(wǎng)絡(luò)請求消耗的電量百分比在略低于其它聯(lián)網(wǎng)方式接剩,消耗的總電量在小米手機上高于其它聯(lián)網(wǎng)方式切厘,在魅族手機上略低于其它聯(lián)網(wǎng)方式。消耗電量的差異不大懊缺,在0.5mah以內(nèi)疫稿。
4、流量消耗
誤差說明:網(wǎng)絡(luò)請求的發(fā)送和接收流量存在一定誤差鹃两。
結(jié)論:
1遗座、網(wǎng)絡(luò)發(fā)送流量HttpURLConnection最高,Volley次之俊扳,OKHttp第三位途蒋,HttpClient最少。但是馋记,數(shù)據(jù)量差別不大号坡,零點幾的請求差別。
2梯醒、累積接收流量HttpClient最大宽堆,HttpURLConnection和Volley相同,OkHttp略大于前兩者茸习。
5畜隶、聯(lián)網(wǎng)平均耗時
誤差說明:網(wǎng)絡(luò)的狀況可能會影響網(wǎng)絡(luò)請求時間。
結(jié)論:網(wǎng)絡(luò)請求平均耗時HttpClient最大,HttpURLConnection最小籽慢,Volley平均比前者高10ms20ms浸遗,OkHttp比Volley高20ms40ms。
綜上得出最終結(jié)論:
1嗡综、對于新的應(yīng)用程序乙帮,應(yīng)該更加偏向于使用HttpURLConnection,因為在以后的工作當中Google也會將更多的時間放在優(yōu)化HttpURLConnection上面极景。
谷歌自己也是推薦用HttpUrlConnection察净,對它進行了大量的優(yōu)化,這個從安卓的幫助文檔可以看出來:
http://developer.android.com/reference/java/net/HttpURLConnection.html
2盼樟、對于已經(jīng)成熟的應(yīng)用氢卡, Volley停止了更新,而OkHttp得到了官方的認可晨缴,并在不斷優(yōu)化译秦。
**因此我建議使用OkHttp,現(xiàn)在最新穩(wěn)定版為3.2.0 **