`
bunnyswe
  • 浏览: 10459 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

 

翻译自http://blog.publicobject.com/

       大多数有网络连接的Android应用会使用HTTP协议发送和接收数据。Android包含两种Http客户端类, HttpURLConnection和Apache HttpClient。这两者都支持HTTPS,streaming 上传与下载,配置超时时间,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只能关掉连接池。

 

 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 请求以以下三种方式之一处理:

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

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

·  没有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, 这是我们以后花费精力去探索的地方。

 

 

1
4
分享到:
评论

相关推荐

    Android-A Programmer's Guide部分译文

    - **在Android Emulator上运行应用程序**:Android Emulator是一种虚拟设备,允许开发者在没有物理设备的情况下测试应用程序。通过Emulator,可以模拟各种Android设备的环境,从而确保应用在不同设备上的兼容性和...

    基于Android的毕业设计外文翻译(教学和教育类应用文献)

    随着移动设备的普及和网络技术的不断进步,我们可以预期,未来会有更多的教育应用软件出现在Android及其他移动平台上,进一步促进学习方式的创新和教育质量的提升。而相关研究也会继续深入,探索如何更有效地利用...

    Android开发毕业论文外文翻译原文+译文

    在UI设计原则部分,可能会探讨Material Design,这是Google推荐的Android设计规范,包括色彩、布局、图标等元素的使用,以及响应式设计,确保应用在不同设备上都有良好的显示效果。 数据存储方面,可能涉及SQLite...

    Android中Activity的生命周期英语论文+译文

    这是一个有关于Android开发平台的论文译文

    电子邮件客户端软件论文

    这篇论文旨在分析电子邮件客户端的工作原理、功能特性,以及在信息技术环境中如何优化其性能和用户体验。 电子邮件作为互联网通信的核心部分,其客户端软件是用户与邮件服务器交互的桥梁。论文可能首先介绍了电子...

    基于android数独游戏设计翻译译文.doc

    总结来说,基于Android的数独游戏设计涵盖了Android开发的基本技能,如Java编程、Android API的使用、UI设计、数据存储和处理、性能优化等。随着Android平台的不断发展,开发者有更多的机会创造创新的应用,满足用户...

    Trados 使用技巧- 译文批量导入记忆库

    综上所述,“Trados使用技巧-译文批量导入记忆库”的核心在于利用WinAlign工具高效地构建翻译记忆库,并通过Trados平台实现记忆库的有效利用。这一流程不仅简化了翻译工作的复杂度,提高了工作效率,还促进了翻译...

    在Android上开发属于自己的定制化启动器

    此为android官网的译文http://krelve.com/android/10.html

    基于android数独游戏设计-翻译(译文).doc编程资料

    基于android数独游戏设计-翻译(译文).doc

    Android安全的了解--外文原文及译文(可编辑).doc

    《理解Android安全——外文原文及译文》 Android安全是移动设备领域的重要议题,尤其在我们日常携带的智能设备成为新一代开放操作系统的核心时。这些新的环境催生了各种创新应用和市场,同时也使得与现有在线服务的...

    精品专题资料(2021-2022年收藏)基于android数独游戏设计翻译译文.doc

    综上所述,基于Android的数独游戏设计不仅涉及编程语言和软件工程,还包括对移动设备特性和操作系统的深刻理解。开发者需要结合用户需求、硬件限制和Android平台特性,来创建一个功能完整、用户体验良好的数独游戏...

    google android揭秘(Unlocking Android的中文翻译版).part2

    google android揭秘(Unlocking Android的中文翻译版)

    android外文翻译

    4. **Activity与Intent**:Android应用的核心组件Activity管理和Intent的使用,Intent用于在不同组件间传递消息,是Android系统实现组件间通信的关键。 5. **BroadcastReceiver**:介绍了BroadcastReceiver的使用,...

    毕业论文 外文原文及译文

    标题中的“Microsoft Access 2000: Choosing between MSDE and Jet”指的是在使用Access 2000时,开发者面临的一个关键决策:选择使用改进版的Jet引擎还是微软数据引擎(MSDE)。这两个数据引擎都是用于存储和管理...

    AndroidArchitecture-毕业论文1

    对于Android应用程序(App)的开发,选择合适的架构模式至关重要,它决定了软件的可维护性、扩展性和性能。本文主要探讨了基于Model-View-Presenter(MVP)模式的Android App架构设计,并通过具体案例进行了深入分析...

    Android翻译Demo

    解析JSON并提取翻译结果后,将译文显示在Android应用的界面上即可。你可能需要创建一个TextView或者EditText控件来展示原文和译文,使用TextView的setText()方法更新内容。 为了提高用户体验,还可以添加一些额外的...

    译文-Netty教程

    它极大地简化了网络编程的工作,使得开发者能够把精力集中在应用程序逻辑上,而不是底层的网络通信细节。 Netty作为一个Java库和API,主要用于编写高并发的网络系统、网络应用和服务。它与标准的Java API的主要区别...

Global site tag (gtag.js) - Google Analytics