Android网络连接,HttpsURLConnection还是ApacheHTTPClient?

大多数联网的Android app都使用HTTP协议来发送和接收数据。Android包含两个HTTP客户端:HttpsURLConnection和Apache HTTP Client。它们都支持HTTP协议,使用流来上传和下载数据,并且可以设定超时(timeouts),IPV6和连接池(connectionpooling)。

Apache HTTP Client

DefaultHttpClient以及和它同一系的AndroidHttpClient是适用于网络浏览器的扩展HTTP客户端类。它们拥有大量艰涩难懂的API,实现方式比较陈旧而且含有少量的Bug。


HttpsURLConnection

HttpsURLConnection是一个通用的轻量级HTTP客户端,它适用于大多数应用。这个类最初非常简陋,但是它少而集中的API使得它能够很容易改进。

在Android2.2以前,HttpsURLConnection有一些非常致命的bug。比如说,如果你对一个可读的InputStream调用close()方法,将会对连接池造成致命问题。所以如果要在Android2.2以前的版本上使用这个类的话,需要关闭连接池。

private void disableConnectionReuseIfNecessary() {
    // HTTP connection reuse which was buggy pre-froyo
    if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
        System.setProperty("http.keepAlive", "false");
    }
}

Android2.3添加了默认的响应压缩。HttpsURLConnection会在对外的请求上自动加上Accept-Encoding: gzip的文件头,并且处理相应的响应。这样当支持这个特性的客户端对你的Web服务发出请求时,你可以压缩相应的响应。

需要注意的是,因为HTTP文件头Content-Length返回的是压缩后的大小,所以使用getContentLength()来为解压后的数据设定缓存的大小是错误的,正确的做法是循环读取响应得到的字节,直到InputStream.read()返回-1。

在Android2.3中还有其他几项改进。比如在这个版本中HttpsURLConnection试着使用SNI协议连接服务器,这个协议允许几个HTTP主机共享一个IP地址。并且它也支持压缩和会话票据。如果这些连接失败了,那么Android会自动重试不带有这些特性的连接。这样HttpsURLConnections能够在兼容老服务器时,充分利用这些特性来提高对新服务器的连接效率。

Android4.0添加了响应缓存。建立了缓存后,HTTP请求将会以下面三种方式之一来获得响应:

  • 完全缓存的响应将直接从本地资源中获得数据,因为这些数据是直接有效的,不需要在访问网络。
  • 条件缓存的响应将会连接服务器来验证本地资源是否为最新的。客户端将会发送一个类似于“昨天以后,如果foo.bng改变了,请发给我最新的数据”的请求。服务器会根据实际情况返回更新的内容或者“304 Not Modified”状态。如果请求的内容没有改变,那么就不会进行数据下载。
  • 没有缓存的响应将会从服务器得到数据。这些数据将会被存储到响应缓存中。

你可以在支持的设备上,使用类反射来建立响应缓存。下面的例子将会在Android4.0上建立响应缓存,但是并不会影响历史版本。

private void enableHttpResponseCache() {
    try {
        long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
        File httpCacheDir = new File(getCacheDir(), "http");
        Class.forName("android.net.http.HttpResponseCache")
            .getMethod("install", File.class, long.class)
            .invoke(null, httpCacheDir, httpCacheSize);
    } catch (Exception httpResponseCacheNotAvailable) {
    }
}

你需要配置你的Web服务,在它的响应中添加缓存的文件头。


要使用那一个?

Apache HTTP Clients 在Android2.2以前的版本中,Bug比较少,运行稳定。因此在这些版本中应该使用Apache HTTP Clients。

在Android2.3以后的版本中,HttpURLConnection是比较好的选择。因它的API比较简单,并且是轻量级应用,所以更适合于Android。自动压缩和响应缓存能够减少网络访问量,提升速度和节省电量(网络访问是很耗电的)。所以新的Android应用应该使用HttpsURLConnection。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值