Запустите две задачи AsyncTask для параллельных вычислений и продолжите, когда они закончатся.

Мне нужно редактировать огромные растровые файлы, поэтому я хочу использовать все ядра своего устройства, чтобы ускорить процесс. Я подумал, что это будет хорошим решением для:

  • Подсчитайте количество доступных ядер
  • Разбить изображение на [количество ядер] частей
  • Для каждого ядра создайте новый поток и позвольте этому потоку обрабатывать одну часть изображения.

Как мне убедиться, что все потоки выполнены, прежде чем я продолжу другие задачи, такие как сохранение изображения или возврат сообщения о том, что растровое изображение было полностью обработано?


person Goot    schedule 02.11.2012    source источник
comment
Это не дает прямого ответа на ваш вопрос, но я бы не рекомендовал использовать AsyncTask. В зависимости от версии Android эти задачи могут выполняться не параллельно. Я объясняю это немного здесь   -  person Todd Sjolander    schedule 02.11.2012
comment
так что нет асинтаза, а простые потоки? Могу ли я вызывать их из потока пользовательского интерфейса или мне нужно вызывать эти потоки с помощью AsyncTask?   -  person Goot    schedule 02.11.2012
comment
Основная проблема заключается в том, что вы не можете каким-либо образом обновить пользовательский интерфейс из любого потока, кроме потока пользовательского интерфейса. Чтобы потоки, не относящиеся к пользовательскому интерфейсу, обновляли пользовательский интерфейс, вы можете передать потоку Handler, затем запустить поток Handler.post() и передать ему Runnable следующим образом: myHandler.post(new Runnable() { public void run() { //Do UI code here } });   -  person Todd Sjolander    schedule 02.11.2012


Ответы (3)


Я думаю, вам следует создать еще один AsyncTask, который ожидает завершения всех остальных потоков, поэтому в методе doInBackground() вашего ожидания AsyncTask вы можете сделать следующее:

while( task1.getStatus()!=AsyncTask.Status.FINISHED
         || task1.getStatus()!= AsyncTask.Status.FINISHED){
    Thread.sleep(500);
}

а затем в методе onPostExecute() вашей «ожидающей задачи» вы можете продолжить выполнение других задач.

person Ovidiu Latcu    schedule 02.11.2012
comment
да, вы могли бы сделать то же самое. Asynctask в основном просто вспомогательная задача, обернутая вокруг Thread. - person Ovidiu Latcu; 02.11.2012

присоединяйтесь к каждому рабочему потоку после его запуска. все они.

person Jean-Paul Calderone    schedule 02.11.2012

Расширьте класс Handler.Callback с помощью массива, который отслеживает потоки, обрабатывающие конкретное изображение (может потребоваться также расширить Thread, чтобы вы могли указать, какую часть Bitmap обрабатывает конкретный поток), конец каждого потока, обрабатывающего sendMessage, до объект Handler, который вы создаете с помощью экземпляра расширенного класса.

Переопределить handleMessage в расширенном классе, чтобы получить результат определенного потока, удалить поток из массива обработки, сохранить результаты определенного потока. Когда размер обрабатываемого массива равен 0, сложите результаты вместе.

person Emil Davtyan    schedule 02.11.2012