Java 在Android中导入更新的Apache HttpClient jar

Java 在Android中导入更新的Apache HttpClient jar,java,android,apache-httpclient-4.x,apache-httpcomponents,Java,Android,Apache Httpclient 4.x,Apache Httpcomponents,我正在尝试从我的Android客户端发送HTTP/HTTPS post请求 问题: 为什么我的代码会失败 目前为止 我创建了一个apache类/HttpClient调用。一切正常: HttpClient httpClient = new DefaultHttpClient(); 我读到这种方法已经被弃用,所以我切换到了新的推荐方法: HttpClient httpClient = HttpClientBuilder.create().build(); Eclipse没有这个类,所以我不得不下

我正在尝试从我的Android客户端发送HTTP/HTTPS post请求

问题: 为什么我的代码会失败

目前为止 我创建了一个apache类/HttpClient调用。一切正常:

HttpClient httpClient = new DefaultHttpClient();
我读到这种方法已经被弃用,所以我切换到了新的推荐方法:

HttpClient httpClient = HttpClientBuilder.create().build();
Eclipse没有这个类,所以我不得不下载ApacheHttpClient 4.3.3。我通过将其复制到
libs
文件夹并将其添加到构建路径(导入的httpclient、httpclient缓存、httpcore、HttpTime、fluent hc、commons日志、commons编解码器)将其导入到我的项目中

错误消息 最新代码
问题是Android已经包含了ApacheHttpClient的较旧版本(,但大约为4.0beta2)

当您将新版本的JAR添加为应用程序的库时,加载APK时会忽略重复的类。由于HttpClient中的一些新类依赖于对这些其他类所做的修改,dalvik会尽其所能(例如删除引用,&c),但除非有条件地使用它们,否则这可能会导致崩溃

例如,您可以在logcat中看到如下消息:

06-05 00:46:39.083: I/dalvikvm(6286): Could not find method org.apache.http.client.protocol.RequestDefaultHeaders.<init>, referenced from method org.apache.http.impl.client.HttpClientBuilder.build
06-05 00:46:39.083: W/dalvikvm(6286): VFY: unable to resolve direct method 22794: Lorg/apache/http/client/protocol/RequestDefaultHeaders;.<init> (Ljava/util/Collection;)V
06-05 00:46:40.434: D/dalvikvm(6286): DexOpt: couldn't find static field Lorg/apache/http/impl/client/DefaultHttpRequestRetryHandler;.INSTANCE
06-05 00:46:40.434: W/dalvikvm(6286): VFY: unable to resolve static field 8420 (INSTANCE) in Lorg/apache/http/impl/client/DefaultHttpRequestRetryHandler;
06-05 00:46:39.083:I/dalvikvm(6286):找不到方法org.apache.http.client.protocol.RequestDefaultHeaders.,引用自方法org.apache.http.impl.client.HttpClientBuilder.build
06-05 00:46:39.083:W/dalvikvm(6286):VFY:无法解析直接方法22794:Lorg/apache/http/client/protocol/RequestDefaultHeaders;。(Ljava/util/Collection;)V
06-05 00:46:40.434:D/dalvikvm(6286):DexOpt:找不到静态字段Lorg/apache/http/impl/client/DefaultHttpRequestRetryHandler;。实例
06-05 00:46:40.434:W/dalvikvm(6286):VFY:无法解析Lorg/apache/http/impl/client/DefaultHttpRequestRetryHandler中的静态字段8420(实例);
此特定消息是因为
DefaultHttpRequestRetryHandler
,它是。还有很多

回到最初的问题,使用更新的httpclient的唯一方法是重命名所有类,这样就不会发生这些名称冲突。这就是我们要做的


更进一步:Debug THPclipse在4.3,但它在Android中是“强>不<强”(除非你考虑了一种弃用的隐形形式——在这种情况下,更新的HTTPclipse也不是首选的选择)。为什么您希望/需要更改它?

一年后的答案是,正确的答案是使用apache库的官方android端口,该端口使用不同的名称空间,从而避免冲突:

它可能在库的最新版本中被弃用。然而,Android使用的是旧版本。我不认为它在Android中被弃用。@matlash弃用和完全删除之间有区别。@EJP但“新建议方法”(
HttpClientBuilder
)在Android中甚至不存在。它在httpclient 4.3中是新的,而android有4.0beta2
DefaultHttpClient
在该版本中尚未弃用,在Android中也未弃用。加载apk时,logcat中没有任何以前的警告吗?由于以前的类失败,一些类可能无法加载。感谢您的全面回答,现在我确实理解了为什么会发生错误。我需要使用更新的HttpClient,因为我在HTTPS认证方面有问题()
static private String insertJson(String json,String url){
    HttpClient httpClient = HttpClientBuilder.create().build();

    String responseString = "";
    try {
        HttpPost request = new HttpPost(url);
        StringEntity params =new StringEntity(json, "UTF-8");
        request.addHeader("content-type", "application/json");
        request.setEntity(params);
        HttpResponse response = httpClient.execute(request);
        HttpEntity entity = response.getEntity();
        responseString = EntityUtils.toString(entity, "UTF-8");

    }catch (Exception ex) {
        ex.printStackTrace();
        // handle exception here
    } finally {
        httpClient.getConnectionManager().shutdown();
    }
    return responseString;
}
06-05 00:46:39.083: I/dalvikvm(6286): Could not find method org.apache.http.client.protocol.RequestDefaultHeaders.<init>, referenced from method org.apache.http.impl.client.HttpClientBuilder.build
06-05 00:46:39.083: W/dalvikvm(6286): VFY: unable to resolve direct method 22794: Lorg/apache/http/client/protocol/RequestDefaultHeaders;.<init> (Ljava/util/Collection;)V
06-05 00:46:40.434: D/dalvikvm(6286): DexOpt: couldn't find static field Lorg/apache/http/impl/client/DefaultHttpRequestRetryHandler;.INSTANCE
06-05 00:46:40.434: W/dalvikvm(6286): VFY: unable to resolve static field 8420 (INSTANCE) in Lorg/apache/http/impl/client/DefaultHttpRequestRetryHandler;