2014-11-17 3 views
1

당분간 AsyncHttpClient를 사용하여 Android 장치에서 RESTfull WebService를 호출하고 정상적으로 실행 중입니다. FutureTask를 사용하여 최적화하고 싶습니다. 스레드가 완료되었는지 여부를 확인할 수 있습니다. 내가 지금 사용하고있는 코드는 내가 알고하는 WebService를 전화, 전화 호출 가능 < 클래스> 함수 내에서 AsyncHttpClient를 확인하는 것입니다이FutureTask를 사용하여 RESTful 웹 서비스 호출

AsyncHttpClient client = new AsyncHttpClient(); 
    try { 
     client.post(applicationContext, "http://" + ip 
       + ":8080/MyWebService/jaxrs/service/getData", 
       new StringEntity("String"), "application/json", 
       new AsyncHttpResponseHandler() { 

        @Override 
        public void onSuccess(String response) { 


        } 

        @Override 
        public void onFailure(Throwable e, String content) { 
         System.err.println("Exception: " 
            + e.getMessage()); 
        } 

       }); 
    } catch (Exception e) { 
     System.err.println("Exception: " 
            + e.getMessage()); 
    } 

같은 것입니다.

여기에도 AsyncHttpClient가 스레드로 실행되기 때문에 혼란 스럽습니다. Future을 사용하여 웹 서비스를 호출하는 방법

참고 : - 초급 스레딩.

답변

2

미래 + HttpClient를 = AsyncHttpClient

하면 AsyncHttpClient.onSuccess() 또는 AsyncHttpClient.onFailure는()는 스레드가 완료 의미, 또는 여전히 (차단) 실행중인 호출됩니다.

==

여기 예제가 있습니다. FutureTask 및 Executor에 대한 자세한 내용은 Java 문서를 참조하십시오.

FutureTask<HttpResult> future = new FutureTask<HttpResult>(new Callable<HttpResult>() { 
     // GET A HTTP RESULT IN ANOTHER THREAD 
     @Override 
     public HttpResult call() throws Exception { 
      HttpClient httpClient =new HttpClient(); 
      //set url, http method and params 
      HttpResult result = httpClient.getResult(); // sync request, it costs a long time. 
      return result; 
     } 
    }){ 
     // FutureTask.DONE() WILL BE CALLED ASYNCHRONOUSLY 
     @Override 
     protected void done() { 
      try { 
       HttpResult result=get(); 
       //read the result 
      } catch (InterruptedException e) { 
       logger.error("", e); 
      } catch (ExecutionException e) { 
       logger.error("", e); 
      } 

     } 
    }; 
+0

하지만 미래와 마찬가지로 어떤 결과를 발신자에게 다시 보낼 수 있습니까? –

+0

나는 더 많은 내용을 읽고 그것에 대해 연구했고, 비동기 작업에서 비동기 작업이 아닌 비동기 작업으로 되돌아 오는 경우를 발견했습니다. –

+0

@MuneebMirza FutureTask를 사용하는 비동기식 방법은 'Executor.execute (futureTask)'입니다. 다른 스레드에서 실행되도록합니다. Executor는'java.util.concurrent.Executors'에 의해 생성 될 수 있습니다. – Anderson