java - 同时发出多个 Volley 请求

标签 java android multithreading android-volley

我需要同时发送 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/

相关文章:

java - 在android中使用共享首选项存储用户名

java - 如何将参数传递给 ScheduledMethodRunnable 方法

Android USB 主机模式和附件模式

c++ - 具有互斥量的多个锁和死锁的可能性

java - 如何使用hibernate和可选参数进行查询?

java - Android:将 BasicNameValuePairs 的 ArrayList 传递给另一个 Activity

java - 将 Android 设备连接到在另一台设备上创建的 WiFi 热点

java - 线程执行器 - 初学者

c# - 事务死锁,如何设计得当?

java - 根元素类型 "plist"的文档类型声明必须以 '>' 结尾