53

我需要在 Android 应用程序上下载一个网页,我很难决定是使用 Android Apache HTTP 客户端还是 Java 的 URLConnection。

有什么想法吗?

4

3 回答 3

45

自 Gingerbread 以来,Google 一直默默地弃用 Apache HTTP 客户端:http ://android-developers.blogspot.com/2011/09/androids-http-clients.html 。虽然他们没有用过时的注释标记它,但他们建议您将 HttpURLConnection 用于新应用程序:it is where we [Google] will be spending our energy going forward.

就我个人而言,我不喜欢这个决定,宁愿坚持使用 HttpClient 4.1+,因为它更快、错误更少并且会定期更新。虽然您不能将系统库升级到 4.1 版,但您可以将 HttpClient jar 包含到您的 Android 项目中(作为额外的好处,这将允许您不依赖 Google 错误修复和供应商更新)。但是有一个陷阱:为了防止可能与内置库发生冲突,您应该使用 JarJar 工具重命名 httpclient 包。原来有人已经这样做了(重新打包的 jar 和 Android 库项目可供下载):

http://code.google.com/p/httpclientandroidlib/

这是针对 Android 的 HttpClient 4.1 的重新打包。Android SDK中HttpClient的版本是4.0beta2。自 4.0beta 以来,对 HttpClient 进行了多次更新和一些急需的错误修复,例如身份验证缓存。

由于 Google 已弃用 HttpClient 以支持 Java 标准 HttpURLConnection,因此我创建了一个脚本来将 Apache 的 HttpClient 的库存版本转换为 Android 库。

对股票 HttpClient 的更改

  • 将所有包 org.apache.http 重命名为 ch.boye.httpclientandroidlib
  • 删除了所有依赖 org.ietf.* 的类(SPNEGO 认证)
  • 将 org.apache.commons.codec.binary.Base64 替换为 android.util.Base64
  • 创建了一个新类 HttpClientAndroidLog 来替换 org.apache.commons.logging
于 2011-10-12T15:56:18.323 回答
28

对于大多数事情,我会说这HttpClient是要走的路。但是,在某些情况和极端情况下,我会退回到URLConnection. 此处此处的边缘案例示例

编辑
之前有人问过类似的问题:httpclient vs httpurlconnection我认为这HttpUrlConnection会更快一些,因为它HttpClient是建立在标准 Java 库之上的。但是,我会发现HttpClient代码更快、更容易编写和维护。根据下面的评论,核心元素HttpClient已经过性能优化。

如果性能是一个主要问题,那么最好的办法是编写两个客户端,一个使用每种方法,然后对它们进行基准测试。如果您这样做,请告诉我们结果。

于 2011-01-25T21:49:32.380 回答
14

在 Gingerbread 及以后, HttpURLConnection 是要走的路。考虑不推荐使用 Apache HttpClient。(另请注意,Android 不使用 HttpClient 4.1,在另一条评论中提到。)

如果您遇到 Apache HttpClient 更快的情况,请在此处将其报告为错误:http ://code.google.com/p/android/issues/list

于 2011-03-10T19:27:05.190 回答