несколько запросов залпа одновременно - PullRequest
0 голосов
/ 17 июня 2019

Мне нужно отправить 4 http-запроса одновременно и подождать, пока все они не будут завершены (я использую залп)

Я пытался отправить их отдельно в 4-х потоках и использовать thread.join, нокажется, что методы onResponse и onError выполняются в основном потоке, поэтому потоки запроса завершаются после вызова queue.add (jsonArrayRequest).

Я не могу использовать countdownlatch, потому что, как я знаю, сначала он не запускает потоки вв то же время (он запускает их в очереди), а затем блокирует основной поток.

что вы предлагаете?дайте мне знать, если есть лучший способ сделать это, используя Retrofit, OkHttp или другие библиотеки.

1 Ответ

2 голосов
/ 17 июня 2019

Чтобы достичь этого без использования каких-либо шаблонов или других библиотек, вы можете пометить запрос как выполненный, если он ответил, и вызвать метод, в каждом из которых вы хотите выполнить, если все запросы завершены.В этом методе вам просто нужно проверить, все ли запросы выполнены.

Пример:

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 )
...