#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
, чтобы обрабатывать все запросы. Мне также приходится каждый раз устанавливать/снимать блокировку и проверять успешность предыдущего запроса, что снижает читаемость кода.
Есть ли более элегантный способ сделать это?
Спасибо, Стефано