我需要同时发送 4 个 http 请求并等待所有请求完成(我正在使用 volley)
我尝试在 4 个线程中分别发送它们并使用 thread.join,但似乎 onResponse 和 onError 方法在主线程中运行,因此请求线程在调用queue.add(jsonArrayRequest)后完成。
我无法使用 countdownlatch,因为据我所知,首先它不会同时运行线程(它在队列中运行它们),其次它会阻塞主线程。
你有什么建议?让我知道是否有更好的方法使用 Retrofit 、 OkHttp 或其他库来做到这一点。
最佳答案
要在不使用任何模式或其他库的情况下实现此目的,您可以将请求响应后标记为已完成,并在所有请求都完成时调用每个方法中您想要执行的方法。在该方法中,您只需要检查是否所有请求都已完成。
示例:
isRequest1Finished = false;
isRequest2Finished = false;
response1 = null;
response2 = null;
volleyRequest1(new Response.Listener<Something>() {
@Override
public void onResponse(Something response) {
isRequest1Finished = true;
response1 = response;
doSomething();
}
})
volleyRequest2(new Response.Listener<Something>() {
@Override
public void onResponse(Something response) {
isRequest2Finished = true;
response2 = response;
doSomething();
}
})
//....do on all of your requests
在你的doSomething()
方法中:
void doSomething() {
if (isRequest1Finished && isRequest2Finished) {
// do something with the response1, response2, etc....
}
}
但我的建议是使用 RxJava,您可以在其中应用 zip
运算符,它将所有异步响应合并为一个结果:
示例:
Observable request1 = getRequest1();
Observable request2 = getRequest2();
Observable.zip(request1, request2,
new BiFunction<Something, Something, Pair<Something, Something>() {
@Override
public Pair<Something, Something> apply(Something response1, Something response2) {
return new Pair(response1, response2); // you can create a custom object to handle all of the responses
}
})
.map( // do something with your responses )
关于java - 同时发出多个 Volley 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56625720/