【问题标题】:How to wait for two Async HTTP request complete with loopj HTTP library如何使用loopj HTTP库等待两个异步HTTP请求完成
【发布时间】:2015-02-15 06:17:14
【问题描述】:

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

我正在使用 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;
  }
});
}

【问题讨论】:

  • 几乎你所拥有的:你的 A、B 变量。每个成功函数将适当的布尔值设置为 TRUE,然后调用 can_i_proceed(),它执行 if (a && b) { proceed(); }。第一个调用返回,设置它的 var,并且由于 a && b 为假而无法继续。第二个调用返回,设置它的 var,现在 a && b 为真,处理继续。
  • 感谢您的回复。问题是它似乎不是那样工作的。所以如果onSuccess方法也在主线程上运行,所以我们在主线程上有一个'wait'函数,它会阻塞onSuccess的运行!所以我们没有机会更改检查器。

标签: android android-asynctask androidhttpclient loopj


【解决方案1】:

你可以使用

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

    }

}

【讨论】: