在Android上使用Http客户端的选择(译文)

转自: http://www.cnblogs.com/mudoot/archive/2011/11/30/Android_http_clients.html 翻译来源于http://blog.publicobject.com/

大多数有网络连接的Android应用会使用HTTP协议发送和接收数据。Android包含两种Http客户端类,HttpURLConnectionApache HttpClient。这两者都支持HTTPSstreaming上传与下载,配置超时时间,IPv6,以及连接池。

Apache Http Client

DefaultHttpClient和它的兄弟类AndroidHttpClient是适用于web浏览器的可扩展的Http客户端。它们有大量的灵活的API,实现比较稳定,很少有bug。但是,其庞大的API使我们很难去改进而不破坏其兼容性。Android团队现在已不活跃与Apache HttpClient的工作上了。

HttpURLConnection

HttpURLConnection是一个可以适用于各类应用的通用轻量级的Http客户端。该类开始较为简陋,但其关注的API让我们容易平稳地改进它。Froyo(2.2)之前,HttpURLConnection有一些令人沮丧的的bug。尤其是在一个可读的InputStream上调用close()将会阻碍连接池。为了解决这个bug只能关掉连接池。

1 private voiddisableConnectionReuseIfNecessary(){
2 // HTTPconnectionreusewhichwasbuggypre-froyo
3 if(Integer.parseInt(Build.VERSION.SDK)<Build.VERSION_CODES.FROYO){
4System.setProperty("http.keepAlive","false");
5}
6}

Gingerbread(2.3),我们增加了透明的回应(response)压缩。HttpURLConnection将自动地将Accept-Encoding: gzip”头字段添加到请求(request)中,并处理相应的回应。通过更改你的Web服务器配置,实现对支持的客户端返回压缩后的数据。如果压缩出了问题,类文档将提供关掉它的方法。

由于HTTPContent-Length头字段返回的是压缩后的大小,使用getContentLength()去分配解压缩后数据buffer的大小就是错误的。应该从response中读字节直到InputStream.read()返回值为-1

我们还在Gingerbread上对HTTPS作出了一些改进。HttpsURLConnection尝试以Server Name Indication(SNI)连接,SNI允许多个HTTPS host共享同一个IP地址。HttpsURLConnection也同样可以使用压缩和session ticket特性。,一旦连接失败,它会自动不去使用这些特性重试。这使得HttpsURLConnection可以有效地连接最新的服务器,同时不破坏对老旧服务器的兼容性。

Ice Cream Sandwich4.0),我们增加了response cache。安装了cache后,HTTP请求以以下三种方式之一处理:

l完全的cacheresponse将直接从本地存储中获取。因为不需要网络连接,此类response可以立即得到。

l有条件cacheresponse必须在Web服务器验证一下cache的有效性。客户端发送一个请求,比如“如果/foo.png从昨天起有变化则给我新的图片”,服务端的response要么是更新后的内容,要么是304没有修改状态码。如果内容是没有改变的,就不需要下载了。

l没有cacheresponse将从服务器上获取。得到这些response之后会存储到cache以便将来使用。

使用反射机制来使用Https response cache功能。以下示例代码将会在Ice Cream Sandwich上打开response cache功能而不影响到之前的版本:

1 private voidenableHttpResponseCache(){
2 try{
3 longhttpCacheSize=10*1024*1024; // 10MiB
4 FilehttpCacheDir= newFile(getCacheDir(),"http");
5Class.forName("android.net.http.HttpResponseCache")
6.getMethod("install",File. class, long. class)
7.invoke( null,httpCacheDir,httpCacheSize);
8} catch(ExceptionhttpResponseCacheNotAvailable){
9}
10}

当然,你也需要更改你的Web服务器配置,在其Http response中设置cache头字段。

哪一种http客户端最好?

Apache HTTP clientEclair(2.1)Froyo(2.2)bug更少,在这些系统版本上将是最佳选择。

Gingerbread(2.3)起,HttpURLConnection将是最佳选择,其API简单,小巧,非常适合于Android。透明的压缩及response cache减少了网络流量,改进了网络速度,也就更省电。新的应用将应该使用HttpURLConnection,这是我们以后花费精力去探索的地方。

更多相关文章

  1. 万字长文带你了解最常用的开源 Squid 代理服务器
  2. Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务
  3. Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理
  4. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  5. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  6. 亲测源码分享
  7. android studio git使用问题记录
  8. android json数据传递时编码格式的转换
  9. Android(安卓)WebView 微信和支付宝H5调用本地app支付

随机推荐

  1. android 打包 生成apk 出现的问题 javasc
  2. android选择视频文件上传到后台服务器
  3. Android(安卓)开发 设置banner圆角,滑动时
  4. Android(安卓)ListView 实现 GridView 用
  5. Android(安卓)中文API(86)――ResourceCurs
  6. Android,一个函数实现支付宝...
  7. Android(安卓)Screen Monitor
  8. 面试 | Android(安卓)View、布局、动画、
  9. Android(安卓)Studio教程-创建第一个项目
  10. Android(安卓)Keystore System介绍