Android中主要提供了两种方式来进行HTTP操作,HttpURLConnection和AndroidHttpClient。
(一)HttpURLConnection
1、HttpURLConnection 是Sun公司提供的网络连接库,提供通用性、轻量级的网络连接,简单,但可扩展性强,基本的网络请求都满足,同时支持IPv6、代理、授权、Cookies等。
2、支持压缩功能,自动在请求头中加入Accept-Encoding: gzip,但在getContentLength()中获取到的是压缩后的数据长度,要获取实际长度需要读取整个流自己计算。
3、2.2之前存在连接池失效问题,如读取流失败或未完成,后面继续使用时会读取到脏数据。
可以禁用连接池功能。
private void disableConnectionReuseIfNecessary() {
// 这是一个2.2版本之前的bug
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}
4、android 开发团队对 HttpURLConnectioin 比较重视,2.3版本增加 https 的改进,以及一些压缩和会话的机制。如果连接失败,它会自动去尝试重新进行连接。
5、4.0增加 http cache 功能HttpResponseCache,
满足基本的 http 缓存,跟一般的 http cache 原理一样需要服务器支持。
缓存原理简单介绍:
(1)缓存利用http 头的Cache-Control,判断是否失效,未失效或无网络直接读取上次缓存,缓存一般存放于磁盘中。
(2)利用 http 头的If-Modified-Since或If-None-Match,请求数据到服务器,服务器根据If-Modified-Since或If-None-Match的值判断是否数据失效,未失效返回304状态,失效返回新的数据。
在 android 网络连接框架Volley 中自己实现了一套类似的 http cache。
6、请求时自动在 http 头加入手机信息User-Agent。
(二)AndroidHttpClient
1、AndroidHttpClient是Apache公司提供的库,封装了http的请求,参数,内容体,响应等,拥有众多API,但是因封装过多较冗余,很难扩展的同时兼容,目前已很少更新,5.1中已经被弃用。
(三)对比
1、HttpURLConnectioin支持压缩(gzip)和缓存(4.0以后),AndroidHttpClient 不支持,分别用这两 api 请求百度地址抓取数据如下
可见压缩后速度和传输数据量都减少,提升了网络请求性能。
2、android 开发团队已经弃用AndroidHttpClient,建议2.3以前使用 AndroidHttpClient,2.3(含)以后使用HttpURLConnectioin,新项目直接使用HttpURLConnectioin。

本文详细对比了Android中用于HTTP操作的两大方式:HttpURLConnection和AndroidHttpClient,从支持特性、压缩功能、缓存机制、性能优化及Android开发团队的推荐使用上进行了全面解析。

870

被折叠的 条评论
为什么被折叠?



