转自: http://android-developers.blogspot.jp/2011/09/androids-http-clients.html

Level 9以前用client,以后用urlconnection

Most network-connected Android apps will use HTTP to send and receive data. Android includes two HTTP clients: HttpURLConnection and Apache HTTP Client. Both support HTTPS, streaming uploads and downloads, configurable timeouts, IPv6 and connection pooling.

Apache HTTP Client

DefaultHttpClient and its sibling AndroidHttpClient are extensible HTTP clients suitable for web browsers. They have large and flexible APIs. Their implementation is stable and they have few bugs.

But the large size of this API makes it difficult for us to improve it without breaking compatibility. The Android team is not actively working on Apache HTTP Client.

HttpURLConnection

HttpURLConnection is a general-purpose, lightweight HTTP client suitable for most applications. This class has humble beginnings, but its focused API has made it easy for us to improve steadily.

Prior to Froyo, HttpURLConnection had some frustrating bugs. In particular, calling close() on a readable InputStream could poison the connection pool. Work around this by disabling connection pooling:

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

In Gingerbread, we added transparent response compression. HttpURLConnection will automatically add this header to outgoing requests, and handle the corresponding response:

Accept-Encoding: gzip

Take advantage of this by configuring your Web server to compress responses for clients that can support it. If response compression is problematic, the class documentation shows how to disable it.

Since HTTP’s Content-Length header returns the compressed size, it is an error to use getContentLength() to size buffers for the uncompressed data. Instead, read bytes from the response until InputStream.read() returns -1.

We also made several improvements to HTTPS in Gingerbread. HttpsURLConnection attempts to connect with Server Name Indication (SNI) which allows multiple HTTPS hosts to share an IP address. It also enables compression and session tickets. Should the connection fail, it is automatically retried without these features. This makes HttpsURLConnection efficient when connecting to up-to-date servers, without breaking compatibility with older ones.

In Ice Cream Sandwich, we are adding a response cache. With the cache installed, HTTP requests will be satisfied in one of three ways:

  • Fully cached responses are served directly from local storage. Because no network connection needs to be made such responses are available immediately.

  • Conditionally cached responses must have their freshness validated by the webserver. The client sends a request like “Give me /foo.png if it changed since yesterday” and the server replies with either the updated content or a304 Not Modified status. If the content is unchanged it will not be downloaded!

  • Uncached responses are served from the web. These responses will get stored in the response cache for later.

HTTP response caching

Use reflection to enable HTTP response caching on devices that support it. This sample code will turn on the response cache on Ice Cream Sandwich without affecting earlier releases:

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) {
}
}

You should also configure your Web server to set cache headers on its HTTP responses.

Which client is best?

Apache HTTP client has fewer bugs on Eclair and Froyo. It is the best choice for these releases.

For Gingerbread and better, HttpURLConnection is the best choice. Its simple API and small size makes it great fit for Android. Transparent compression and response caching reduce network use, improve speed and save battery. New applications should use HttpURLConnection; it is where we will be spending our energy going forward.

最新文章

  1. 【最后的抒情】【离NOIP还有9个小时】
  2. T-Sql(二)事务(Transaction)
  3. 【转】ArrayList循环遍历并删除元素的常见陷阱
  4. SQL Server存储过程中使用表值作为输入参数示例
  5. Mac Pro 软件收藏
  6. POJ 2186 Popular Cows --强连通分量
  7. uvA Flooded!
  8. Android自动化测试之环境搭建
  9. Codility---MaxProfit
  10. [AHOI2001]质数和分解
  11. winform在鼠标操作时要判断是否按下Ctrl键
  12. jQuery插件AjaxFileUpload文件上传实现Javascript多文件上传功能
  13. IP保留地址
  14. 回溯算法_ BackTracking
  15. 解决刚刚安装完mysql 远程连接不上问题
  16. Bootstrap 、AngularJs
  17. 概率校准与Brier分数
  18. unity, unity默认的Arial字体在编译出的h5版本中不显示
  19. java使用ssh访问Linux的项目jscraft
  20. Python开发【Django】:重构Admin

热门文章

  1. android事件分发(二)
  2. OFbiz实体引擎
  3. TF-IDF与余弦类似性的应用(一):自己主动提取关键词
  4. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3) E. Prairie Partition 二分+贪心
  5. 【bzoj2462】[BeiJing2011]矩阵模板
  6. Hibernate中二级缓存指的是什么?
  7. form之action的绝对路径与相对路径(转载)
  8. POJO与javabean的区别
  9. 构造json参数时key的引号和js string转json的三种方式
  10. CRM 2011 开发中遇到的问题小结