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 - 为什么@Transactional 在另一项提交失败时不回滚一项提交?

multithreading - Rails Thread.current 变量是否与单个用户请求隔离?

c# - 内存屏障如何影响数据的 “freshness”?

Android 模拟器以不同的分辨率启动

android - 如何在 flatMap 中使用await方法?

android - 如何在代码行之间暂停

c++ - 一个套接字在线程中发送/接收

java - 即使删除后对象也会重新绘制

Java Swing 按钮卡住程序

java - 将 java 对象存储为 clob 并检索