同时发出多个截击请求
multiple volley requests at same time
我需要同时发送 4 个 http 请求并等待所有请求完成(我正在使用 volley)
我尝试在 4 个线程中分别发送它们并使用 thread.join 但似乎 onResponse 和 onError 方法在主线程中 运行ning 因此请求线程在调用 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 )
我需要同时发送 4 个 http 请求并等待所有请求完成(我正在使用 volley)
我尝试在 4 个线程中分别发送它们并使用 thread.join 但似乎 onResponse 和 onError 方法在主线程中 运行ning 因此请求线程在调用 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 )