Android的HTTP Client

Stella981
• 阅读 773

大多数联网类Android apps将使用HTTP来发送和接收数据。Android包含两种HTTP客户端:HttpURLConnection和Apache HTTP Client。它们两者都支持HTTPS,streaming上传和下载,可配置的超时,IPv6和连接池。

Apache HTTP Client

DefaultHttpClient 和它的兄弟AndroidHttpClient是适用于web浏览器的可扩展的HTTP clients。它们具有数量众多且灵活的APIs。它们的实现是稳定的,并具有很少的bugs。

但是这个API的大小使得在不破坏兼容性的情况下提升它变得非常困难。Android团队在Apache HTTP Client上面没有活跃的开发。

HttpURLConnection

是一个通用的,轻量级的HTTP client,它适用于大多数应用。这个类具有简陋的初始版本,但它的集中的API使得我们稳定地提升它比较简单。

在Froyo之前,HttpURLConnection具有一些令人困扰的bugs。特别的,在一个可读的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上,我们添加了透明的响应压缩。HttpURLConnection将会自动地把这个header添加到outgoing requests,并处理对应的响应:

Accept-Encoding: gzip

通过配置你的Web server来压缩响应,以使支持它的客户端能充分利用这一点。如果响应压缩出问题了,class documentation显示了如何禁用它。

由于HTTP的Content-Length header返回了压缩后的大小,因而使用getContentLength()来为加压后的数据确定buffers的大小是不正确的。相反,应该从response中读取bytes,直到InputStream.read()返回-1。

在Gingerbread中,我们也对HTTPS做了一些提升。HttpsURLConnection尝试去连接Server Name Indication (SNI),其允许多个HTTPS主机共享一个IP地址。它也能够启用压缩和session tickets。如果连接失败,它会自动地在没有这些功能的情况下重试。这使得HttpsURLConnection在连接到up-to-date服务器时很高效,而又不会老版本的兼容性。

在Ice Cream Sandwich中,我们添加了一个响应cache。通过安装这个cache,HTTP请求将由三种方式中的一种来满足:

  • 完全缓存的响应直接有本地存储器来提供服务。由于不需要连接网络,这种响应是立即可用的。

  • 有条件地缓存的响应必须具有它们webserver的刷新验证。客户端发送一个诸如“Give me /foo.png if it changed since yesterday”的请求,服务器用更新后的内容或一个304 Not Modified状态来回应。如果内容没有改变,它将不会被下载!

  • 未缓存的响应由web服务器来服务。这些响应稍后会被存入响应缓存中。

使用反射来在支持它的设备上启用HTTP 响应缓存。这段示例代码将会在不影响早期版本的情况下在Ice Cream Sandwich上打开响应缓存:

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响应中设置cache headers。

那个client是最好的?

Apache HTTP client在Eclair和Froyo上具有更少的bugs。对于这些版本它是最好的选择。

Gingerbread和更新的版本,HttpURLConnection是最好的选择。它的简单的API和很小的大小使得它很适用于Android。透明的压缩和响应缓存减少了网络使用,提升了速度并节省了电量。新的应用应该使用HttpURLConnection;那也是我们将会耗费大量精力来提升的东西。

译自: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Done.

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这