Как проверить, завершены ли все AsyncTasks?
У меня есть 3 AsyncTasks и 1 ProgressBar. Я хочу, чтобы при выполнении любой из задач индикатор выполнения был видимым, и когда все они заканчиваются, индикатор выполнения невидим.
В Java существует ExecutorService:: isTerminated, чтобы проверить, завершены ли все runables, но Android не работает.
Обновление: одновременно выполняются 3 задачи.
Рис.
![enter image description here]()
Ответы
Ответ 1
Хорошая графика. Но я боюсь, что для этого не существует механизма. Вам придется реализовать его самостоятельно. Существует несколько решений, которые вы можете использовать -
- Сохраните ссылку на все 3 задачи. Когда задача завершается, проверьте, закончены ли еще две задачи, если да, то закройте диалог прогресса, если не дожидаться завершения какой-либо другой задачи и еще раз проверьте. Убедитесь, что вы освободили ссылки, когда закончите.
- Если вы не хотите, чтобы в хранилище ссылок находился счетчик. Когда задача завершится, увеличьте счетчик и проверьте, равно ли оно 3. Если все задачи завершены, и вы закончили. Если вы реализуете это, убедитесь, что вы синхронизировали доступ к счетчику.
Ответ 2
Попробуйте использовать AsyncTask.getStatus(). Это прекрасно работает. См. Пример кода
List<AsyncTask<String, String, String>> asyncTasks = new ArrayList<AsyncTask<String, String, String>>();
AsyncTask<String, String, String> asyncTask1 = new uploadTask().execute(string);
AsyncTask<String, String, String> asyncTask2 = new downloadTask().execute(string);
AsyncTask<String, String, String> asyncTask3 = new createTask().execute(string);
asyncTasks.add(asyncTask1);
asyncTasks.add(asyncTask2);
asyncTasks.add(asyncTask3);
Вы можете позже закодировать AsyncTaskList и найти каждый из статусов задач, как показано ниже.
for(int i=0;i<asyncTasks.size();i++){
AsyncTask<String, String, String> asyncTaskItem = (AsyncTask<String, String, String>)asyncTasks.get(i);
// getStatus() would return PENDING,RUNNING,FINISHED statuses
String status = asyncTaskItem.getStatus().toString();
//if status is FINISHED for all the 3 async tasks, hide the progressbar
}
Ответ 3
Простым обходным решением будет использование трех булевых переменных по одному для каждой AsyncTask и последующего их проверки.
Лучшим подходом было бы создание отдельного класса, который расширяет AsynTask и определяет интерфейс обратного вызова, который запускается в onPostExecute.
Ответ 4
Ну, как вы знаете, когда заканчивается AsyncTask (когда вызывается onPostExecute):
одним из решений может быть создание метода setProgressBarVisible(), который хранит счетчик и когда первые вызываемые множества видимы, а метод setProgressBarInvisible() уменьшает счетчик и когда нуль устанавливает невидимый индикатор выполнения.
Ответ 5
создать поле для хранения всех задач:
private ArrayList<HtmlDownloaderTask> mTasks;
Начните свои задачи таким образом:
HtmlDownloaderTask = new HtmlDownloaderTask(page.getHtml());
task.execute(page.getUrl());
//if you want parallel execution try this:
//task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,page.getUrl());
mTasks.add(task);
в onPostExecute из MyAsyncTask:
int unfinishedTasks = 0;
for (HtmlDownloaderTask myDT : mTasks){
if(!(myDT.getStatus() == AsyncTask.Status.FINISHED)){
unfinishedTasks++;
}
}
if (unfinishedTasks == 1){
//We are all done. 1 Because its the current one that hasnt finished post execute
callWhateverMethod();
}
Ответ 6
: -? я думаю, что это всего лишь трюк. вы вернете некоторое сообщение в onPostExecute
каждого Asyntask
и сравните его. (это сообщение может содержать время, например)
Ответ 7
Я бы просто уведомил об этом на onPostExecute(), обратитесь к onPostExecute и 4 шага в документе для подробностей. Вы можете использовать EventBus для сделать некоторые подписные вещи
Ответ 8
Официальная поддержка CompletableFuture была введена с уровня API 24.
Он также доступен в Java 8 здесь.
Можно просто использовать что-то вроде:
taskA.thenCombine(taskB).thenCombine(taskC)
Ответ 9
попробуйте это, может быть, может помочь вам...
final ImageUploader _upload = new ImageUploader();
_upload.setValue(getApplicationContext(), _imagepath, _urlPHP);
_upload.execute();
Runnable _run;
Handler _h2;
_run = new Runnable() {
public void run() {
_h2 = new Handler();
_h2.postDelayed(this, 1000);
Toast.makeText(getApplicationContext(), "not finished", Toast.LENGTH_LONG).show();
if (_upload.getStatus() == AsyncTask.Status.FINISHED) {
Toast.makeText(getApplicationContext(), "finished", Toast.LENGTH_LONG).show();
_h2.removeCallbacks(_run);
}
}
};
_h2 = new Handler();
_h2.postDelayed(_run, 1);