Стартирайте две AsyncTasks за паралелно изчисление и продължете, когато приключат

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

  • Пребройте броя на наличните ядра
  • Разделете изображението на [numberofcores] части
  • За всяко ядро ​​създайте нова нишка и оставете тази нишка да обработва една част от изображението

Как да се уверя, че всички нишки са готови, преди да продължа с други задачи, като запазване на картината или връщане на съобщение, че растерното изображение е обработено напълно?


person Goot    schedule 02.11.2012    source източник
comment
Това не отговаря директно на въпроса ви, но не бих препоръчал да използвате AsyncTask. В зависимост от версията на Android може да не изпълнява тези задачи паралелно. Обяснявам това малко тук   -  person Todd Sjolander    schedule 02.11.2012
comment
така че няма асинхронна задача, а прости нишки? Мога ли да ги извикам от UI-Thread или трябва да извикам тези нишки чрез 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