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阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容