2013-08-13 2 views
0

Я использую расширенный цикл for и оператор switch для запуска различных AsyncTasks. Как я могу приостановить каждую итерацию цикла, чтобы подождать, пока какая-либо данная AsyncTask не будет сочтена? Я пытался создать поток и ждать/присоединяться/уведомлять, когда каждый AsyncTask завершен, но я просто замораживаю пользовательский интерфейс. Ниже мой фрагмент кода ...Приостановка расширенного цикла для цикла

for (Integer integer : sequence) { 

    switch (integer) { 
     case 1: // Async process 
      break; 
     case 2: // Async process 
      break; 
     case 3: // Async process 
      break; 
     case 4: // Async process 
      break; 
     default: break; 


     } 

     //Need magic solution here... 

    } 

ответ

0

Петля не является хорошим выбором. Добавьте обратный вызов «finish» после каждого AsyncTask(). Создайте такую ​​цепочку кода. Вы можете сохранить последнее добавленное в цепочке, чтобы добавить новый элемент в цепочку.

0

При вызове AsyncTask используйте .get() так:

new MyAsyncTask().execute().get(); 

Это приостановит свой код до тех пор, пока AsyncTask возвращает что-то

Edit: Другой вариант заключается в том, чтобы бросить цикл for в своей собственной AsyncTask, чтобы он также был фоновой, позволяя вам взаимодействовать с пользовательским интерфейсом

0

То, что вы делать не является хорошим выбором дизайна. Вы никогда не должны блокировать поток пользовательского интерфейса или вы столкнетесь с печально известным сообщением об ошибке ANR.

Если вы хотите использовать класс AsyncTask, попробуйте использовать его так, как предполагается, он будет использоваться. AsyncTask используется, как сказано в названии, для асинхронных фоновых операций (и коротких!), Но вы синхронизируете основной поток с его исполнением, выполняя всю свою цель.

Сделайте свою фоновую работу в doInBackground(), а затем сообщите об этом пользовательскому интерфейсу в onPostExecute(). Этот метод гарантированно будет выполняться в потоке пользовательского интерфейса, поэтому вам не придется беспокоиться о проблемах с параллелизмом. Вы также можете использовать onPorgressUpdate() и onPreExecute() для уведомления о потоке пользовательского интерфейса от AsyncTask.

Для более конкретных предложений вы должны дать нам больше намеков о том, чего вы пытаетесь достичь.

+0

Я пытаюсь использовать AsyncTask для Simon-подобных процессов. Цикл должен проходить через каждую кнопку (на основе значения Integer). Я использую AsyncTask для сна в течение 1 секунды в методе doInBackground, используя как onPreExecute, так и onPostExecute для обновления состояний кнопок в пользовательском интерфейсе. Есть ли лучший способ сделать что-то подобное? – Jason

+0

Переместите весь управляющий код в свой собственный поток и обновите пользовательский интерфейс асинхронно. AsyncTask - не лучший способ обработки длинных фоновых операций. Попытайтесь использовать свой собственный поток и общаться с потоком пользовательского интерфейса через обработчик. Держите поток пользовательского интерфейса как можно более чистым и выполняйте только связанные с ним операции. –

Смежные вопросы