在Android上使用Http客户端的选择(译文)
来源:互联网 发布:4g语音与数据 编辑:程序博客网 时间:2024/04/28 04:38
大多数有网络连接的Android应用会使用HTTP协议发送和接收数据。Android包含两种Http客户端类, HttpURLConnection和Apache HttpClient。这两者都支持HTTPS,streaming 上传与下载,配置超时时间,IPv6, 以及连接池。
Apache Http ClientDefaultHttpClient和它的兄弟类AndroidHttpClient是适用于web浏览器的可扩展的Http客户端。它们有大量的灵活的API,实现比较稳定,很少有bug。但是, 其庞大的API使我们很难去改进而不破坏其兼容性。 Android团队现在已不活跃与Apache HttpClient的工作上了。
HttpURLConnectionHttpURLConnection是一个可以适用于各类应用的通用轻量级的Http客户端。该类开始较为简陋,但其关注的API让我们容易平稳地改进它。 在Froyo(2.2)之前,HttpURLConnection有一些令人沮丧的的bug。尤其是在一个可读的InputStream上调用close()将会阻碍连接池。为了解决这个bug只能关掉连接池。
- 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(2.3),我们增加了透明的回应(response)压缩。HttpURLConnection将自动地将“Accept-Encoding: gzip”头字段添加到请求(request)中,并处理相应的回应。 通过更改你的Web服务器配置,实现对支持的客户端返回压缩后的数据。如果压缩出了问题,类文档将提供关掉它的方法。
由于HTTP的Content-Length头字段返回的是压缩后的大小,使用getContentLength()去分配解压缩后数据buffer 的大小就是错误的。 应该从response中读字节直到InputStream.read()返回值为-1。
我们还在Gingerbread上对HTTPS作出了一些改进。HttpsURLConnection尝试以Server Name Indication(SNI)连接, SNI允许多个HTTPS host共享同一个IP地址。HttpsURLConnection也同样可以使用压缩和session ticket特性。,一旦连接失败,它会自动不去使用这些特性重试。这使得HttpsURLConnection可以有效地连接最新的服务器,同时不破坏对老旧服务器的兼容性。
在Ice Cream Sandwich(4.0),我们增加了response cache。安装了cache后,HTTP 请求以以下三种方式之一处理:
l 完全的cache的response将直接从本地存储中获取。因为不需要网络连接,此类response可以立即得到。
l 有条件cache的response必须在Web服务器验证一下cache的有效性。客户端发送一个请求,比如“如果/foo.png从昨天起有变化则给我新的图片” , 服务端的response要么是更新后的内容,要么是304 没有修改状态码。如果内容是没有改变的,就不需要下载了。
l 没有cache的response将从服务器上获取。得到这些response之后会存储到cache以便将来使用。
使用反射机制来使用Https response cache功能。以下示例代码将会在Ice Cream Sandwich上打开response cache功能而不影响到之前的版本:
- 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 response中设置cache头字段。
哪一种http客户端最好?Apache HTTP client在Eclair(2.1)和Froyo(2.2)上bug更少,在这些系统版本上将是最佳选择。
从Gingerbread(2.3)起,HttpURLConnection将是最佳选择,其API简单,小巧,非常适合于Android。透明的压缩及response cache减少了网络流量,改进了网络速度,也就更省电。 新的应用将应该使用HttpURLConnection, 这是我们以后花费精力去探索的地方。
- 在Android上使用Http客户端的选择(译文)
- 在Android上使用Http客户端的选择(译文)
- Android的HTTP客户端选择及HttpResponseCache的使用
- 开始在Android上使用Retrofit并创建Http请求客户端
- Thrift在Android上的客户端实现
- XMPP在android客户端上的应用 Androidpn的使用[找不到org.androidpn.client.PersistentConnectionListener]
- XMPP在android客户端上的应用 Androidpn的使用[找不到org.androidpn.client.PersistentConnectionListener]
- 【消息推送】--小米推送在Android客户端和PHP服务器上的联合使用
- Android动画译文(上)
- 关于在Android客户端上百度地图的基本功能实现
- Thrift在Android上的客户端实现(二):文件传输
- 译文——OkHttp, 安卓和Java应用的HTTP&HTTP2.0客户端
- 怎样选择一个合适的nosqldatabase用在android上
- 在数据结构使用 xml或json上的选择分析
- Android异步的HTTP客户端
- [Android开发] Android客户端使用HTTP通信
- android的socket客户端在模拟上运行完美,是手机上不能连接上socket
- 译文:在闭包中使用循环变量是有害的
- vs中,在ASPX文件下面有智能提示,但是为什么新建一个类,却没了智能提示
- Youp(orn)网站架构
- Android Service
- 互联网技术网站
- 听到大师兄的事情
- 在Android上使用Http客户端的选择(译文)
- 50个必备的实用jQuery代码段
- Android4.04下载源码图解~解决公网IP不能直接访问问题
- 在repeater中实现radiobutton单选
- V4L2视频采集与H.264编码源码大放送:Linux视频采集与编码(三)
- Linux Kconfig及Makefile学习
- linux字符设备按键驱动之防抖动
- Java2Json转换器
- haxe NME 值得学习