У меня есть набор HTTP-запросов, каждый ответ добавляет запись в ArrayList. Позже я использую этот список, чтобы выполнить некоторые проверки. Как я могу заставить программу ждать, пока все запросы не будут выполнены, и список будет заполнен, прежде чем продолжить проверку?Thread: подождите, пока не будет завершен набор задач async.
EDIT
Пример кода:
class BackgroundTask extends AsyncTask<Void,String,Void>{
List<Integer> responses;
@Override
protected synchronized Void doInBackground(Void... params) {
responses= new ArrayList<Integer>();
for(int i=0; i<10; i++){
restAPI.getNextInt(// SEND HTTP REQUEST
new Response.OnSuccess() { // ON SUCCESS CALLBACK
@Override
public void onResponse(Integer i) {
responses.add(i);
}},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}});
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
И в моей главной теме:
BackgroundTask bt = new BackGroundTask();
bt.execute();
bt.get(10000, TimeUnit.MILLISECONDS); // THIS DOESN'T WAIT
if(bt.responses.contains(10)){
...
}
Я не предоставил код раньше, потому что я ищу общее решение, не определенное для меня
EDIT 2
Вот моя вторая попытка, что она не работает. Я положил все в основной поток.
final Semaphore sema = new Semaphore(-params.size()+1);
final List<Integer> responses = Collections.synchronizedList(new ArrayList<Integer>());
for(final Param p : params){
new Thread(){
@Override
public void start(){
restAPI.nextInt(p, // SEND HTTP REQUEST
new Response.OnSuccess() { // ON SUCCESS CALLBACK
@Override
public void onResponse(Integer i) {
System.out.print("aaaaa");
sema.release();
responses.add(i);
}},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
sema.release();
}});
}
}.start();
}
try {
sema.acquire();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if(responses.contains(10))
...
Теперь, что происходит, что все блоки/остановки в sema.acquire()
и ааааа никогда не печатает. Если я удалю sema.acquire()
, тогда aaaaa печатает.
Всего код находится в protected void onPostExecute(Void result)
в качестве AsyncTask
, если это имеет значение ...
Вы используете каждый HTTP-запрос в отдельном потоке? – markg
использовать один AsyncTask ... – Selvin
@markg Нет, у меня есть цикл for для отправки всех запросов в тот же поток в AsyncTask – ApollonDigital