【问题标题】:Apache HTTP client or URLConnection [duplicate]Apache HTTP 客户端或 URLConnection [重复]
【发布时间】:2011-06-15 12:14:38
【问题描述】:

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

有什么想法吗?

【问题讨论】:

标签: java android urlconnection apache-commons-httpclient


【解决方案1】:

自 Gingerbread:http://android-developers.blogspot.com/2011/09/androids-http-clients.html 以来,Google 一直默默地弃用 Apache HTTP 客户端。虽然他们没有用过时的注释标记它,但他们建议您将 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。已经有几个 更新 HttpClient 和一些急需的错误修正,如身份验证缓存 从 4.0beta 开始。

由于 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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 你知道谁更快吗?
  • HttpClient 4.1 应该明显比 HttpUrlConnection 快。见wiki.apache.org/HttpComponents/…。在我的测试中,只有普通的 HttpCore 比 HttpClient 快
  • @Dave。已经为优化 HttpCore(HttpClient 所基于的低级传输组件)付出了很多努力。已采取特殊情况以确保在请求执行过程中仅创建最少量的中间垃圾。但请注意,我个人参与了 HttpClient 的开发,因此我的意见可能存在偏见。
  • @oleg 不幸的是,由于所谓的“兼容性要求”,Android 永远不会随 HttpClient 4.1 一起发布(bla-bla……那么自 API 8 以来已删除的 VMRuntime 怎么样?)。就我个人而言,我认为他们只是不想费心让 httpclient 与您的开发保持同步(现在 Google 默默地决定弃用它),但这并没有改变重点 - 在 Android 上使用 HttpClient 4.1 的唯一方法是将其作为单独的 Jar 重命名包包含,以避免与内置版本的类冲突。
  • 我发现了这个由 Android Dalvik 团队成员撰写的博客。它说最好使用 HttpURLConnection 向前。 android-developers.blogspot.com/2011/09/…
【解决方案3】:

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

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

【讨论】:

  • 真的吗?为什么?你们有没有在任何地方宣布过这个?我原以为人们普遍认为 Apache HttpClient 是更好用的 API。
  • Hughes:Google 自己在上次 I|O 上告诉我们恰恰相反,我们应该使用 HttpClient 而不是 HttpUrlConnection。而且,自从我上次查看以来,HttpURLConnection 是通过 HttpClient 实现的。这真的很重要,所以如果这确实是 Google 希望我们前进的方向,那么如果我们能多宣传一下就好了。
  • @CommonsWare 最近才在这里宣布:android-developers.blogspot.com/2011/09/…[HttpClient] implementation is stable and they have few bugs. But the large size of this API makes it difficult for us to improve it without breaking compatibility. The Android team is not actively working on Apache HTTP Client.天啊。我记得 oleg attempted to synchronize 如何与 Android 团队进一步开发项目。现在他们决定弃用 HttpClient ——这真是太可惜了。
  • @Idolon: HttpClient 未被弃用;他们只是没有积极尝试改进它。
  • 如果您遇到 Apache HttpClient 更快的情况,请在此处将其报告为错误 - :)
猜你喜欢
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多