Apache HttpAsyncClient - NoSuchMethodError - URIUtils.extractHost

时间:2012-04-26 14:04:57

标签: java android asynchronous httpclient nosuchmethoderror

我正在尝试使用Apache HttpAsyncClient(版本4.0-beta1,这是撰写本文时的最新版本)在Android上实现REST通信。

我的问题是,我无法得到任何请求,因为来自框架的WITHIN的MethodNotFound错误。

详细的堆栈跟踪是(在显示的行之后,下一个来自我自己的代码):

java.lang.NoSuchMethodError: org.apache.http.client.utils.URIUtils.extractHost
    at org.apache.http.impl.nio.client.AbstractHttpAsyncClient.determineTarget(AbstractHttpAsyncClient.java:594)
    at org.apache.http.impl.nio.client.AbstractHttpAsyncClient.execute(AbstractHttpAsyncClient.java:578)
    at org.apache.http.impl.nio.client.AbstractHttpAsyncClient.execute(AbstractHttpAsyncClient.java:569)

我所做的是以下内容:

private static final String SERVER_SCHEME = "http";
private static final String SERVER_HOST = "localhost";
private static final int SERVER_PORT = 3000;
private static final String SERVER_BASE_PATH = "/api/v1";
private static final String PATH_LOGIN = "/login";

private DefaultHttpAsyncClient http_client;

public void test(String email, String password, ConnectionManagerCallback callback) {
    this.http_client = new DefaultHttpAsyncClient();
    this.http_client.start();

    this.http_client.getCredentialsProvider().setCredentials(new AuthScope(SERVER_HOST, SERVER_PORT), new UsernamePasswordCredentials(email, password));
    HttpPost request = new HttpPost(SERVER_SCHEME + "://" + SERVER_HOST + ":" + SERVER_PORT + SERVER_BASE_PATH + PATH_LOGIN);

    this.http_client.execute(request, new Callback(REQUEST_LOGIN, callback));
}

为了示例,我删除了异常处理。问题是,我得到了上面描述的例外。因此,由于它是测试版,我想为HttpPost使用不同的构造函数。但即使我向构造函数提供了一个URI对象,它也会尝试调用extractHost方法并崩溃。

有人对我有任何帮助吗?我刚刚添加了JAR,并没有自己编译库。

1 个答案:

答案 0 :(得分:3)

Apache HttpAsyncClient基于名为HttpCore的低级HTTP传输库。谷歌Android附带了一个非常过时的Apache HttpClient版本,该版本也基于相同的库。 HttpAsyncClient需要一个与Android一起提供的更新版本的HttpCore。但是,每当尝试从较新版本调用方法时,类加载器会首先获取旧版本的类,从而导致NoSuchMethodError异常。

不幸的是,这个问题的唯一解决方案是将所有HttpAsyncClient代码及其依赖项移动到不同的名称空间。