我的情况是我需要用两个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);
}
}