如何等待两个异步HTTP请求完成与loopj HTTP库



我的情况是我需要用两个HTTP get请求从服务器获取两组数据,然后一起处理它们。

我正在使用loopj的http库来完成任务。

问题是,由于loopj的http是异步的,这意味着我无法确定它们何时完成以及哪个将首先完成。它们都有自己的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;
  }
});
}

你可以使用

SyncHttpClient

而不是

AsyncHttpClient

然后,在两个不同的线程中执行每个 SyncHttpClient,并为每个 SyncHttpClient 传递相同的回调。第二次执行回调后继续执行代码。回调方法应使用 sync 关键字定义,以避免函数同时被两个不同的线程访问/调用。

编辑:

所以像这样的事情

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

相关内容

  • 没有找到相关文章

最新更新