2014-12-16 7 views
2

제 경우는 두 개의 HTTP get 요청과 함께 서버에서 두 세트의 데이터를 가져와 함께 처리해야한다는 것입니다.loopj HTTP 라이브러리를 사용하여 두 개의 비동기 HTTP 요청을 완료하는 방법

나는이 작업을 수행하기 위해 loopj의 http 라이브러리를 사용하고있다.

문제는 loopj의 http가 Async이므로 완료 시점과 완료 시점을 결정할 수 없음을 의미합니다. 모두 자체 onSuccess 기능을 가지고 있습니다. 내가 그들 각각에 부울 플래그를 넣으려고 노력하고 호출 활동이 두 부울의 AND 연산의 변경을 확인하도록 만들었지 만 주 스레드 대기를 만들면 onSuccess 함수도 대기하게됩니다.

두 요청이 모두 완료되면 다음 단계로 진행할 수있는 방법을 결정할 수 있습니까? 호출 활동에

:

코드처럼

boolean A; 
boolean B; 

HttpRequestA(); 
HttpRequestB(); 

while (!(A&&B)) { 
    Thread.sleep(100); 
} 

HttpRequestA은 다음과 같습니다

public void HttpRequestA() { 
    A = false; 
    HTTPService.get(url, new TextHttpResponseHandler() { 
    @Override 
    public void onFailure(int statusCode, Header[] header, String responseString, Throwable throwable) { 
} 

    @Override 
    public void onSuccess(int statusCode, Header[] header, String responseString) { 
    A = true; 
    } 
}); 
} 
+0

같은 꽤 많이있어 무엇을 : 당신의 A는, B는 바르. 각 성공 함수는 적절한 부울을 TRUE로 설정하고 can_i_proceed()를 호출합니다.이 함수는 if (a && b) {proceed(); }'. 첫 번째 호출이 돌아오고, var를 설정하고, && b가 false이기 때문에 계속 진행할 수 없습니다. 두 번째 호출이 돌아오고, var를 설정하면 && b가 참이고 처리가 계속됩니다. –

+0

답장을 보내 주셔서 감사합니다. 문제는 그런 식으로 작동하지 않는 것 같습니다. 따라서 onSuccess 메소드가 메인 쓰레드에서 실행 중일 때 메인 쓰레드에서 'wait'함수를 사용하면 onSuccess 실행을 막을 수 있습니다! 따라서 우리는 체커를 변경할 기회가 없습니다. –

답변

2

당신은

SyncHttpClient 

대신

사용할 수 있습니다
AsyncHttpClient 

그런 다음 두 개의 다른 스레드에서 각 SyncHttpClient를 실행하고 각 SyncHttpClient에 대해 동일한 콜백을 전달합니다. 두 번째로 콜백을 실행하면 코드를 계속 진행하십시오. 동시에 두 개의 다른 스레드가 함수를 호출하거나 호출하지 않도록하려면 synchronized 키워드를 사용하여 콜백 메서드를 정의해야합니다.

편집 :

그래서이

class Example implements AsyncHttpResponseHandler{ 

    int executedTasks = 2; 

    void executeHttpRequests(){ 
     new HttpExecutor(this).start(); 
     new HttpExecutor(this).start(); 
    } 

    @Override 
    public synchronized void onStart() { 
     // called before request is started 
    } 

    @Override 
    public synchronized void onSuccess(int statusCode, Header[] headers, byte[] response) { 
     executedTasks--; 
     if (executedTasks == 0){ 
      // continue, otherwise wait for other callback 
     } 
    } 

    @Override 
    public synchronized void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) { 
     // called when response HTTP status is "4XX" (eg. 401, 403, 404) 
    } 

    @Override 
    public synchronized void onRetry(int retryNo) { 
     // called when request is retried 
    } 

} 

class HttpExecutor extends Thread{ 

    AsyncHttpResponseHandler callback; 

    public HttpExecutor(AsyncHttpResponseHandler callback){ 
     this.callback = callback; 
    } 

    @Override 
    public void run(){ 

     SyncHttpClient client = new SyncHttpClient(); 
     client.get("http://www.google.com", callback); 

    } 

}