2012-04-26 1 views
0

Apache HttpAsyncClient (버전 4.0-beta1,이 글을 쓰는 시점에서 최신)로 Android에서 REST 통신을 구현하려고합니다.Apache HttpAsyncClient - NoSuchMethodError - URIUtils.extractHost

내 문제는 프레임 워크에서 오는 MethodNotFound 오류로 인해 요청을받을 수 없다는 것입니다.

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)); 
} 

나는 예외 제거한 :

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) 

은 내가 한 일은 다음과 같다 :

자세한 스택 트레이스는 (제시된 행 후, 다음 하나는 내 자신의 코드에서 유래)입니다 예제를위한 처리. 문제는 위에서 설명한 예외가 발생한다는 것입니다. 그래서 베타 버전이므로 HttpPost에 다른 생성자를 사용하려고 생각했습니다. 그러나 constructur에 URI Object를 제공하더라도 extractHost 메서드를 호출하여 충돌을 시도합니다.

아무에게도 도움이되지 않습니까? 방금 JAR을 추가했고 라이브러리를 직접 컴파일하지 않았습니다.

+0

사용중인 Jar 파일이 귀하의 코드 (최신 버전/이전 버전)와 호환되지 않는다고 생각합니다. 올바른 버전을 얻으려면 Jar 버전에 따라 코드를 변경하십시오. – kosa

+0

답변 [here] (http://stackoverflow.com/questions/10155513/android-nosuchmethoderror-with-apk-file-apache-httputils-core/10258360#10258360)이 도움이되는지 확인하십시오. – yorkw

답변

3

Apache HttpAsyncClient는 HttpCore라는 저수준 HTTP 전송 라이브러리를 기반으로합니다. Google Android는 동일한 라이브러리를 기반으로 한 Apache HttpClient의 버전이 지나치게 오래된 상태로 배송됩니다. HttpAsyncClient에는 Android와 함께 제공되는 최신 버전의 HttpCore가 필요합니다. 그러나 이전 버전의 클래스가 클래스 로더에 의해 선택되면 새 버전에서 메소드를 호출 할 때마다 NoSuchMethodError 예외가 발생합니다.

불행히도이 문제에 대한 유일한 해결책은 모든 HttpAsyncClient 코드와 해당 종속성을 다른 이름 공간으로 이동하는 것입니다.