【前言】开发android的手机客户端,通常都要通过模拟http请求与服务器端通信,android给我们提供了两种方式的http client客户端接口,一种是采用Apache HTTP Client,一种是采用HttpURLConnect,那么到底选择哪种方式好呢?来自google android Dalvik team团队的Tim Bray工程师在android官方blog上的一篇文章告诉了我们答案,下面是我的翻译:
大多数的android app的网络连接都会使用http方式发送和接收数据,android包含了两个http客户端类库:HttpURLConnection 和Apache HTTP Client。两个都支持https,文件流上传和下载,配置超时,ipv6和连接池技术。
Apache HTTP Client
DefaultHttpClient 以及它的兄弟类AndroidHttpClient都是适合于Web浏览器的可扩展的HTTP客户端。他们有大量灵活的api,他们的实现稳定而且很少有bug。但是,其巨大的API数量导致我们很难在不破坏兼容性的条件下来改善它,android团队对于Apache HTTP Client改善工作并不是很积极.
HttpURLConnection
HttpURLConnection是一个通用的,轻量级的http客户端,适合大多数的应用,这个类开始比较粗糙,但是对于我们来说其一些关键的api上提高稳定性是简单的。在Froyo(2.2)以前,HttpURLConnection有一些令人沮丧的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(2.3),我们添加了透明响应压缩技术。在HttpURLConnection会自动的添加这个头标识来发送请求,并且处理响应的结果:
Accept-Encoding: gzip
利用这个来配置你的Web服务器,以支持返回压缩后的响应数据给客户端。如果响应压缩是有问题的,可参见类文档如何关掉它。
因为http的Content-Length头字段返回的是压缩后的大小,所以通过调用 getContentLength() 方法来获取未压缩的缓冲数据大小是错误的。而应该从响应中读取字节直到InputStream.read()返回-1.
在Gingerbread上我们对HTTPS还作出了一些改进。HttpsURLConnection尝试以Server Name Indication(SNI)连接, SNI允许多个HTTPS host共享一个IP地址。HttpsURLConnection还具备压缩和会话ticket功能。没有这些功能,一旦连接失败,它会自动重试。这使得HttpsURLConnection可以高效地连接到最新的服务器,同时不破坏对旧服务器的兼容性。
在Ice Cream Sandwich(2.4 ),我们增加了响应缓存cache。当缓存cache生效后,HTTP 请求将会以下面三种方式之一处理:
(1)全缓存响应将直接从本地存储中获取。因为不需要网络连接导致响应可以立即获到。
(2)有条件的缓存响应必须在Web服务器做一下刷新验证。客户端发送一个请求,比如“Give me /foo.png if it changed since yesterday” , 服务端的响应要么是更新后的内容,要么是304 没有修改的状态码。如果内容是没有改变,就不需要下载了。
(3)没有缓存的响应将从服务器上获取。这些响应之后将存储在响应cache中。
可以使用”反射“(reflection)机制来使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头字段。
哪一个更好呢?
Apache HTTP client在Eclair(2.1)和Froyo(2.2)上bug很少,在这些版本上使用是最好的选择。
在Gingerbread(2.3)系统及以后,HttpURLConnection将是最佳选择。其API简单而且小巧,非常适合于Android。透明压缩及响应缓存机制减少了网络流量,提升网络速度,节省电池电量。 新的应用将应该使用HttpURLConnection, 它是我们Android团队致力于前进的方向!
译自:http://android-developers.blogspot.com/2011/09/androids-http-clients.html
分享到:
相关推荐
jWebSocket Server - 基于Java的WebSocket服务器,用于...并且现在可以应用在任何其他Java、Android客户端。 jWebSocket - 基于Flash的WebSocket插件的跨浏览器兼容性。 FlashBridge – 告诉双向所有浏览器双向通信。
Email clients info for LinuxPatches for the Linux kernel are submitted via email
remote-desktop-clients 项目为 Android 和黑莓 10 提供 VNC, RDP, SPICE, 和 oVirt/RHEV/Proxmox 客户端支持。 标签:remote
提供 iOS和Android平台SDK采用Redis实现分布式部署.SHA-256 HMAC连接认证和隐私保护多种类型的频道 – 私有, 用户限制,客户端限制通过名字空间灵活配置频道支持即时消息和历史消息支持用户加入/离开消息网络重连后...
epub-press-clients 易于使用的客户端,可以使用构建电子书。 后端代码可以在。 在关注我们。 总览 EpubPress是一项用于将文章/博客/网页缝合到自定义电子书中的服务。 :glowing_star: 好处 :glowing_star: ...
用于ezyfox服务器的android客户端 概要 用于ezyfox服务器的android客户端 文献资料 程式码范例 1.创建一个TCP客户端 val clients = EzyClients .getInstance() val client = clients.newClient(config) 2.设置...
介绍这是bVNC,aRDP,aSPICE和Opaque(四个Android远程桌面客户端)的源代码。 请参阅LICENSE文件,以获取有关如何许可来源的信息。建造取决于操作系统,使用的是预先构建的库还是从头开始构建它们,有多种方法来...
epub-press-clients易于使用的客户端,用于通过EpubPress构建电子书。 后端代码可以在haroldtreen / epub-press中找到。 在推特上关注我们。 概述EpubPress是用于缝合文章/ bl的服务epub-press-clients易于使用的...
频谱客户 该项目托管该实用程序以生成各种语言的客户端存根,这些存根允许通过服务调用访问频谱服务实例。... Scala C-Sharp Android-java Objective-C swagger-codegen 支持其他语言,稍后可能会包含这些语言。
解析适用于Android的LiveQuery Client ParseQuery是Parse的关键概念之一。 它允许您通过指定一些条件来检索ParseObject ,从而轻松构建诸如仪表板,待办事项列表甚至某些策略游戏之类的应用程序。 但是, Parse...
自定义电报客户端定制的(可能是恶意的)电报客户端的精选列表您是否认识另一个失踪的客户,或认为其中一个是恶意的? 请打开一个Android / Google Play 名称包裹名字发行人地位电报org.telegram.messenger 电报FZ-...
分数小兵Android 适用于Score Minion的Android应用请参阅在线自述文件:/Users/martincochran/gae-docs/cloud.google.com/appengine/docs/python/endpoints/gen_clients 用于添加客户端库的初始设置:生成端点库...
目前,Raspberry PI IP 地址是硬编码的,根据您的 IP 地址进行更改并将其作为现有 PhoneGap 项目导入或使用构建您自己的 Android/iOS/Windows Phone 客户端 Pebble Watch 客户端 这是一个使用 pebble.js 开发的 ...
:D)用法该存储库包含Android Studio项目中的android镜像应用程序,以及用于各种平台的镜像客户端/查看器。 镜像代码主要存在于两个称为AndroidViewer和AndroidServer的类中,这两个类分别在镜像客户端和服务器中...
先决条件MongoDB 节点js 适用于Android开发的IDE组件android src(客户端代码) 节点js服务器包含(imp): - Files : drop files here which can be accessed by Clients - Video : drop videos here which can be ...
BlinkenLightsSchiller版 以NodeMCU作为客户端和服务器的BlinkenLight项目,在... 客户端正在通过连接的IR-LED发送IR信号,但是客户端不知道颜色更改是否成功。 但是通常没有问题。 #clients#NodeMCU v0.1充
使用C#开发本机移动和桌面应用程序可带来许多好处,包括在多个客户端应用程序之间最大程度地重用您的投资,使他们能够在客户端和服务器应用程序中重用共享的功能,库,知识,开发工作流和环境。 ServiceStack增强...
1.1 包含一个标准的SMPP Server(SMPP模拟器),一个SMPP Client 和 SDK 1.2 支持标准的SMPP V3.4...9 Good compatibility, can co-work with nearly all the mainstream and non-mainstream gateways/servers/clients
首先我们要在服务器建立一个ServerSocket ,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。 Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个
.Net Standard allows developing apps that run on all common platforms available today, including Linux, iOS, Android (via Xamarin) and Windows 7/8/8.1/10 (including embedded/IoT editions) without ...