4

这是异常的核心:

12-12 10:37:50.090: E/AndroidRuntime(8277): Caused by: java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>

我正在使用 Apache httpclient 4.2.2。然而,Android 决定使用其捆绑的过时 Apache httpclient 库是一个更好的选择。

我怎样才能避免这个异常?

以防万一:更改 org.apache 命名空间不是一个选项,因为此异常是由闭源库引发的。

4

2 回答 2

3

然而,Android 决定使用其捆绑的过时 Apache httpclient 库是一个更好的选择。

谷歌关心向后兼容性。正如您所发现的,HttpClient 具有不同版本的不同 API,因此如果 Google 升级 HttpClient,所有现有应用程序都会中断。Google 需要维护一个一致的公共 API,以便为 Android 1.x 编写的应用程序可以在 Android 4.x 等上运行。不幸的是,谷歌选择的 HttpClient 版本导致与较新的 HttpClient 版本的公共 API 快速中断。

我怎样才能避免这个异常?

使用jarjar或等效将 HttpClient 库的副本重构为不同的包名称,然后使用它。

更改 org.apache 命名空间不是一个选项,因为此异常是由闭源库引发的。

然后用其他东西替换闭源库。显然,如果闭源库需要 HttpClient 4.2.2,那么该闭源库将无法在 Android 上运行,并且在 Android 上不受其开发人员的支持。即使您要解决 HttpClient 问题(例如,通过 ROM 模块 -- 见下文),该库在与 Android 的兼容性方面也可能存在其他问题。

或者,下载 Android 源代码,将 HttpClient 版本替换为您自己的版本,构建修改后的 Android 源代码,将结果倒入 ROM mod,然后将 ROM mod 安装到您想要的设备上。在此过程中,请务必测试任何现有的应用程序,以确保它们不会因为您的更改而中断(很可能使用HttpUrlConnection,但也可能不会)。

于 2012-12-12T12:15:08.453 回答
0

此链接可能会有所帮助,它是 HttpClient 4.2.3 for Android 的重新打包,您可以在项目中将其作为库 jar/外部库引用:

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

于 2013-11-27T22:38:31.713 回答