Мне нужен ваш совет по поводу последовательного / параллельного AsyncTask.
Цель:
asyncA1
и asyncA2
с тем же именем класса AsyncA
запустить серийный номер.
asyncA1
/ asyncA2
и asyncB1
выполнить параллельно (другое имя класса).
Запуск AsyncTasks:
AsyncA asyncA1 = new AsyncA(1);
asyncA1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
AsyncA asyncA2 = new AsyncA(2);
asyncA2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
AsyncB asyncB1 = new AsyncB(1);
asyncB1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Пример AsyncA, AsyncB такой же, но с другим именем класса:
private static class AsyncA extends AsyncTask<Void, Void, Void> {
int number;
private static final AtomicInteger cntr = new AtomicInteger(0);
AsyncA(int n){
number = n;
}
@Override
protected Void doInBackground(Void... voids) {
Log.i(TAG, "!!!Task:"+number+": Enter to doInBackground(). Thread:"+Thread.currentThread().getName());
//Waiting for finish previous task
while(cntr.get() != 0){
try {
Log.i(TAG, "!!!Task:"+number+": Previous task is not completed => go to sleep");
Thread.sleep(1000);
} catch (InterruptedException ignore) {}
}
cntr.incrementAndGet();
//Any work..
try {
Log.i(TAG, "!!!Task:"+number+": Work in doInBackground()");
Thread.sleep(5000);
} catch (InterruptedException ignore) {}
cntr.decrementAndGet();
return null;
}
@Override
protected void onPostExecute(Void v) {
Log.i(TAG, "!!!Task:"+number+" completed. Thread:"+Thread.currentThread().getName());
}
}
Я могу сделать это через cntr
AtomicInteger
переменная и Thread.sleep
, но я думаю, что это не хорошее решение.Какие-либо предложения?Спасибо.