同时发出多个截击请求

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 )