ProgressBar с несколько AsyncTask

Виталий Робиновский

Я новичок в программирование. Как прикрутить один ProgressBar к двум и более AsyncTask? В интернете нашел примеры, как используют с одним AsyncTask, а как сразу к нескольким?

GetTaskIgrok getTaskIgrok = new GetTaskIgrok(); getTaskIgrok.execute(); GetTaskIgrok getTaskName = new GetTaskName(); getTaskName.execute();

Вот один из классов AsyncTask.

public class GetTaskIgrok extends AsyncTask<string, void,="" string=""> { private Exception exception; protected String doInBackground(String... urls) { try { String getResponse = get(...); return getResponse; } catch (Exception e) { this.exception = e; e.printStackTrace(); return null; } } protected void onPostExecute(String getResponse) { //............. } public String get(String url) throws IOException { Request request = new Request.Builder() .url(url) .header("Content-Type", "application/json; charset=utf-8") .build(); Response response = client.newCall(request).execute(); return response.body().string(); } }
</string,>
2 ответа

Виталий Робиновский

Здесь можно по-разному. Основное: если не показывается ProgressBar и стартует AsyncTask, то показываем ProgressBar. При запуске последующих AsyncTask проверяем что ProgressBar показывается и если да, то пропускаем показ.

Когда AsyncTask завершает работу, проверяем не последний ли он. Если последний, то скрываем ProgressBar, если нет, то пропускаем.

Из простейшего - можете завести счетчик. При запуске нового AsyncTask увеличиваете. Если он больше 1, пропускаете старт ProgressBar. При завершении AsyncTask уменьшаете, если будет равен 0, то скрываете.


Виталий Робиновский

1) Запустить одновременно 2 и более AsyncTask Вам не удастся, если Вы не запустите их методом executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR). Иначе таски будут выполняться по очереди.

2) ProgressBar можно запустить непосредственно до старта обеих тасок.

3) Когда Вы запустили параллельно таски, Вам нужно синхронизировать прогресс. Для этого нужно завести один общий счетчик. Увеличение этого счетчика и обновление UI необходимо синхронизировать, иначе получите гонку данных:

synchronized void increment() { count++; uiHandler.post(...); //update ProgressBar
}

licensed under cc by-sa 3.0 with attribution.