Check if all AsyncTasks have finished

23,875

Solution 1

Nice graphic. But I am afraid there is no build in mechanism for this. You'll have to implement it by yourself. There are few solutions you could use -

  1. Keep a reference to all 3 task. When task finishes check if the other two tasks are finished too, if yes than close the progress dialog if no wait for some other task to finish and check again. Make sure you free the references when you're done.
  2. If you don't want to keep a reference store a counter. When the task finishes, increment the counter and check if it's equal to 3. If all tasks finished and you are done. If you implement this make sure to synchronized the access to the counter.

Solution 2

Try using AsyncTask.getStatus(). This works perfectly fine. Refer below sample code.

 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);

You can later loop the AsyncTaskList and find each of the tasks' status as below.

 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
 }

Solution 3

A simple workaround would be to use three boolean variables one each for each AsyncTask and then check them accordingly.

A better approach would be to create a separate class that extends AsynTask and defines a callback interface which is fired in onPostExecute.

Solution 4

Well as you do know when an AsyncTask ends (when onPostExecute gets called): one solution could be to create a method setProgressBarVisible() that keeps a counter and when first called sets visible, and a method setProgressBarInvisible() that decreases the counter and when zero sets the progress bar invisible.

Solution 5

create a field to hold all tasks:

private ArrayList<HtmlDownloaderTask> mTasks;

Start your tasks this way:

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);

on the onPostExecute of 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();

}
Share:
23,875
emeraldhieu
Author by

emeraldhieu

Updated on July 09, 2022

Comments

  • emeraldhieu
    emeraldhieu almost 2 years

    I have 3 AsyncTasks and 1 ProgressBar. I want when any of task executes, the progress bar is visible and when all of them finish, the progress bar is invisible.

    In Java, there is ExecutorService::isTerminated to check if all runnables finished but Android doesn't have it.

    Update: 3 tasks execute at the same time.

    Figure. enter image description here

  • Mathieu Brouwers
    Mathieu Brouwers about 9 years
    I did it without the names, but it worked out perfectly.. Thanks! I did remove the items from the ArrayList afterwards (when status == finished) instead of just checking the status. This would make it easier on larger sets of asyncTasks like my set of 30+ tasks..