Запрос на запрос: Как дождаться ответа, который будет обработан для выполнения следующего запроса

#java #android #multithreading #api #request

Вопрос:

Я создаю приложение для Android, которое должно выполнять несколько последовательных запросов к API. Я помещаю каждый Request из них в a RequestQueue для обработки. Однако каждому Request из них требуются некоторые параметры, полученные в результате предыдущего Request , и они не должны обрабатываться, если предыдущий Request завершится неудачно.

Прямо сейчас мое решение выглядит примерно так:

 private final Object lock = new Object();
private boolean success = false;

private void releaseLock() {
   synchronized (lock) {
      lock.notifyAll();
   }
}

private void setLock() {
   synchronized (lock) {
      try {
         lock.wait(60000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
   }
}

private void fetch() {
   StringRequest request1 = new StringRequest(
      Request.Method.GET,
      url,
      response -> {
         success = true;
         releaseLock()
      }),
      error -> {
         success = false;
         releaseLock();
      }) {...};

   StringRequest request2 = ...

   new Thread(()->{
      success = false;
      requestQueue.add(request1);
      setLock();

      if (!success)
         return;

      success = false;
      requestQueue.add(request2);
      setLock();
   }).start()
}
 

Проблема с этим подходом, на мой взгляд, заключается в том, что он на самом деле не использует RequestQueue , поскольку он всегда состоит из одного элемента, и мне приходится вручную создавать экземпляр a Thread , чтобы обрабатывать все запросы. Мне также приходится каждый раз устанавливать/снимать блокировку и проверять успешность предыдущего запроса, что снижает читаемость кода.

Есть ли более элегантный способ сделать это?

Спасибо, Стефано