Apache HTTP客户端或URLConnection

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

有什么想法吗?

对于大多数情况,我会说HttpClient是要走的路。 但是有一些情况和边缘情况,我会回到URLConnection 。 这里和这里的边缘案例的例子

编辑
之前有一个类似的问题: httpclient与httpurlconnection 。 我会假设HttpUrlConnection有点快,因为HttpClientbuild立在标准的Java库之上。 不过,我会发现HttpClient代码更快,更容易编写和维护。 根据下面的评论, HttpClient的核心元素已经进行了性能优化。

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

Google自从Gingerbread: http : //android-developers.blogspot.com/2011/09/androids-http-clients.html,已经默默弃用了Apache HTTP客户端。 虽然他们没有用不赞成使用的注释来标记它们,但是他们build议你将HttpURLConnection用于新的应用程序,因为it is where we [Google] will be spending our energy going forward

就个人而言,我不喜欢这个决定,宁愿坚持HttpClient 4.1+,因为它更快,有更less的错误,并定期更新。 尽pipe无法将系统库升级到4.1版本,但是您可以将HttpClient jar包括到您的Android项目中(因为这样可以让您不依赖于Google bug修复和供应商更新)。 但是有一个缺点:为了防止与内置库的冲突,你应该使用JarJar工具重命名httpclient包。 原来有人已经这样做(重新打包的jar和Android库项目可供下载):

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

这是Android的HttpClient 4.1重新打包。 Android SDK中的HttpClient版本是4.0beta2。 自从4.0beta以来,HttpClient已经有了几个更新,还有一些急需的错误修正,比如authcaching。

由于谷歌已弃用HttpClient赞成Java标准的HttpURLConnection,我创build了一个脚本来将Apache的HttpClient的股票版本转换为Android库。

更改股票HttpClient

  • 将所有包org.apache.http重命名为ch.boye.httpclientandroidlib
  • 删除所有依赖于org.ietf。*的类(SPNEGOauthentication)
  • 用android.util.Base64replaceorg.apache.commons.codec.binary.Base64
  • 创build一个新的类HttpClientAndroidLog来取代org.apache.commons.logging

在姜饼和后来,HttpURLConnection是要走的路。 不推荐使用Apache HttpClient。 (另外请注意,Android不使用HttpClient 4.1,在另一个评论中提到。)

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