Подтвердить что ты не робот

Как проверить, завершены ли все AsyncTasks?

У меня есть 3 AsyncTasks и 1 ProgressBar. Я хочу, чтобы при выполнении любой из задач индикатор выполнения был видимым, и когда все они заканчиваются, индикатор выполнения невидим.

В Java существует ExecutorService:: isTerminated, чтобы проверить, завершены ли все runables, но Android не работает.

Обновление: одновременно выполняются 3 задачи.

Рис. enter image description here

4b9b3361

Ответ 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 и сравните его. (это сообщение может содержать время, например)

Ответ 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);