2012-04-26 30 views
0

我想用Apache HttpAsyncClient(版本4.0-beta1,這是寫這篇文章時最新的版本)在Android上實現REST通信。Apache HttpAsyncClient - NoSuchMethodError - URIUtils.extractHost

我的問題是,我無法得到任何請求,因爲來自框架內的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,並沒有自己編譯庫。

+0

我認爲您使用的Jars與您的代碼(新版本/舊版本)不兼容。嘗試獲得正確的版本(或)根據Jar版本更改您的代碼。 – kosa 2012-04-26 14:25:47

+0

看看答案[這裏](http://stackoverflow.com/questions/10155513/android-nosuchmethoderror-with-apk-file-apache-httputils-core/10258360#10258360)有幫助。 – yorkw 2012-04-26 23:07:10

回答

3

Apache HttpAsyncClient基於名爲HttpCore的低級HTTP傳輸庫。 Google Android附帶了一個基於同一個庫的極其過時的Apache HttpClient版本。 HttpAsyncClient需要Android附帶的HttpCore的更新版本。但是,當嘗試從較新版本調用某個方法時,舊版本的類會首先被類加載器拾取,從而導致NoSuchMethodError異常。

不幸的是,這個問題的唯一解決方案是將所有HttpAsyncClient代碼及其依賴項移動到不同的名稱空間。

相關問題