获取NoSuchFieldError INSTANCE org/apache/http/message/BasicHeaderValueParser错误

29

我正在开发一个 Android 应用程序。我使用 httpcore 4.3.3。当我尝试使用 ContentType.parse(string) 时,它会出现这个错误:

java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicHeaderValueParser; in class Lorg/apache/http/message/BasicHeaderValueParser; or its superclasses (declaration of 'org.apache.http.message.BasicHeaderValueParser' appears in /system/framework/ext.jar)

我做了一些谷歌搜索,理解了我为什么会出现错误,但我不确定如何修复它。从我所读的内容来看,ContentType 试图使用 Android 自带的 BasicHeaderValueParser 类,但该类尚未具有 INSTANCE 字段。请帮忙解决吗?

这些是相关的导入:

compile('org.apache.httpcomponents:httpmime:4.3.6') {
    exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpcore:4.3.3'

你正在使用Proguard吗? - Emmanuel
我不这么认为。最近我升级到了Android Studio 1.0,它让你使用minifyEnabled而不是runProguard,我想我已经将它们设置为false了。我可以尝试将它们设置为true,但是还有其他的解决方法吗? --> 看起来好像没有解决问题。 - joshkendrick
1
使用jarjar重新打包Apache Http库,或者使用较旧的Httpmime库(检查哪个版本与您项目的minSdk兼容)。 - Selvin
6个回答

91

很抱歉,HttpCore的原版无法在Android中使用。 请使用Apache HttpClient Android Port,它也包括必需的HttpCore类。

compile('org.apache.httpcomponents:httpmime:4.3.6') {
    exclude module: 'httpclient'
}
compile 'org.apache.httpcomponents:httpclient-android:4.3.5'

4
我曾尝试使用httpmim:4.5这种方式,但它并没有起作用,不过换成4.3.6版本就可以了(https://dev59.com/4Ynca4cB1Zd3GeqP5xEM#29473284)。别忘了这一点。 - GuilhE
需要哪些其他库?因为我遇到了错误 - Error:(76, 64) error: cannot access HttpEntity class file for org.apache.http.HttpEntity not found 我已经使用了你回复中提到的相同库。此外,我是从这里重定向过来的 - [link]https://dev59.com/SI_ea4cB1Zd3GeqPPIKo[/link] - Jimit Patel
1
好的,我找到了解决方案,请查看这里 - https://dev59.com/SI_ea4cB1Zd3GeqPPIKo - Jimit Patel
@oleg 链接 我该如何在Eclipse中添加它?另外,当我尝试获取Android的HttpClient jar文件时,这里的链接链接 已经失效了,我该怎么办? - Flying Monkey
对我有用,谢谢。 - Rahul
如果你想避免一些错误,请使用4.3.5.1而不是4.3.5。 - 0x777C

2

下载最新的Apache Httpclient Jar文件并重构路径名称。这对我很有用。


1

看起来你在使用不兼容的httpmime和httpclient-android的jar包。尝试使用httpmime的4.3.6版本。


1

只需在lib文件夹中添加版本为4.3.6的httpmime_4.3.6.jar文件,并在gradle(应用级别)中添加implementation files('lib/httpmime-4.3.6.jar')。


0

简单的解决方案是使用:

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

这是针对Android的Appache HttpClient端口,封装在不同的包名称中,以避免与现有的Android版本发生干扰。 将该jar文件导入Android项目中,使用“ch.boye.httpclientandroidlib”代替“org.apache.http”。


-1
注意:如果您同时使用Apache httpmime和Retrofit,请使用旧版本的Apache httpmime。
例如:在我的情况下,我使用这个来上传图像到服务器并获取内容长度/图像大小。
这是一个旧版本(不是很老)或之前的版本,您应该为两个实现相同的旧版本。
这是Retrofit的新版本,您应该使用旧版本的Apache httpmime。
非常感谢,如果您喜欢我的解决方案,请为我投票。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接