Android’s HTTP Clients && Android HttpURLConnection

来源:互联网 发布:淘宝助理4.6官方下载 编辑:程序博客网 时间:2024/05/29 14:27

转载请说明出处,原文地址:http://blog.csdn.net/yang_hai_long/article/details/51787734


英文原文是Google developer写的post。原文地址:http://android-developers.blogspot.com/2011/09/androids-http-clients.html

文章结构 完全照搬原文,只做翻译~

原文 作者发布时间是2011.9.29.

Android‘s HTTP Clients

[This post is by Jesse Wilson from the Dalvik team. —Tim Bray]

多数Android app都是通过http协议进行网络通信。Android 系统提供了两个 HTTP client:HttpURLConnection 和 Apache HTTP Client。两个都可以配置 timeouts, ipv6, 连接池,支持HTTPS,通过流(streaming)上传下载。

Apache HTTP Client

DefaultHttpClient和 AndroidHttpClient是姊妹类,都是HTTPClient的子类适合 web browsers。他们都提供了大量灵活的API。这些接口的实现是稳定的而且bug比较少。

但是也正是庞大的API是我们(Google 开发人员)很难在不破坏它兼容性的同时来升级维护HTTPClient。同时Android开发组不是很情愿来维护升级Apache的HTTP Client,毕竟不是亲生的(这句是我加的,嘎嘎)。

HttpURLConnection

HttpURLConnection是一个通用的,轻量级的HTTP client,她可以满足大多数app的需求。这个类设计之初API比较少,这样易于我们对她稳步的维护升级。

在Froyo(Android 2.2)之前,HttpURLConnection面含有一些重大bugs. 其中一个最重要的 bug 是,当你的InputStream 调用close()方法时,数据连接池会被毒害。可以通过以下方式是不连接数据连接池。

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");    }}

在Gingerbread(Android 2.3),HttpURLConnection会自动把Accept-Encoding: gzip添加到请求头中。然后就是配置你的web 服务器为客户端压缩response。如果压缩response有问题,这个文章将告诉你怎么不使用压缩response。因为HTTP header的 Content-Length返回的是压缩过的长度,所以你用getContentLength()返回的是压缩后的长度。而你读取数据时(已解压),不能以这个长度作为长度标志位,要用InputStream.read()!=-1做判断是否读取完毕。

在Gingerbread(Android 2.3)我们也升级了HTTPS请求。HttpsURLConnection会尝试连接SNI(Server Name Indication,一种允许多个HTTPS主机公用一个IP地址)。同时HTTPS也支持压缩和session tickets。如果连接失败,他会自动重连,但是会自动去掉这些特性。这样HttpURLConnection与新的服务器连接时就会效率更高,同时还没破坏 与连接失败服务器 的兼容性。

在 Ice Cream Sandwich(Android 4.0),我们加入了response cache,缓存的三种方式如下:

 1.完全的本地缓存响应,完全由本次缓存提供响应。所以在没有网的情况下,她也可以立刻给出响应。

 2.有条件的相应,服务器必须支持验证。例如我发送一个“Give me/foo.png if it changed since yesterday”。服务器会返回新的数据流,如果foo.png这个图片变化过(时间节点是从昨天到发请求的那一刻 时间段内变化过)。如果没变过,服务器一般会返回 304 状态代表没变化过,同时如果没变化过,将不会重新下载foo.png图片。

 3.无缓存相应一般用于web.这些响应只是存储在相应本身的缓存中,供后面使用。

可以使用反射机制来使用HTTP响应缓存。示例代码如下(这个代码并不会影响Ice Cream Sandwich 4.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服务器上的HTTP响应设置缓存头。

这两种client哪种好一点呢?

Apache HTTP Client在 Eclair(Android 2.0,2.1) 和 Froyo(Android 2.2)上bug很少,API很强大。所以这两个版本上推荐使用她。

对于Gingerbread(Android 4.0)及后面版本,推荐使用HttpURLConnection。她的API简单易用,同时体积更小,很适合Android这种移动平台。而且她支持传输压缩,响应缓存,这样可以减少网络的负担和节省电量。同时Google以后会花费大量精力来维护升级她。

0 0
原创粉丝点击