如何检查所有AsyncTasks是否完成?

我有3个AsyncTasks和1个ProgressBar 。 我希望当任何任务执行时,进度条都可见,当所有任务完成时,进度条是不可见的。

在Java中,有ExecutorService::isTerminated来检查是否所有runnables都已完成但Android没有。

更新:3个任务同时执行。

数字。 在此处输入图像描述

漂亮的图形。 但我担心没有建立机制。 你必须自己实现它。 您可以使用的解决方案很少 –

  1. 保留对所有3个任务的引用。 当任务完成时,检查其他两个任务是否也完成,如果是,则关闭进度对话框,如果没有等待其他任务完成并再次检查。 确保在完成后释放引用。
  2. 如果您不想保留参考商店的计数器。 任务完成后,递增计数器并检查它是否等于3.如果所有任务都完成并且您已完成。 如果实现此操作,请确保同步对计数器的访问。

尝试使用AsyncTask.getStatus()。 这完全没问题。 请参阅以下示例代码。

  List> asyncTasks = new ArrayList>(); AsyncTask asyncTask1 = new uploadTask().execute(string); AsyncTask asyncTask2 = new downloadTask().execute(string); AsyncTask asyncTask3 = new createTask().execute(string); asyncTasks.add(asyncTask1); asyncTasks.add(asyncTask2); asyncTasks.add(asyncTask3); 

您可以稍后循环AsyncTaskList并查找每个任务的状态,如下所示。

  for(int i=0;i asyncTaskItem = (AsyncTask)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 } 

一个简单的解决方法是为每个AsyncTask使用三个布尔variables,然后相应地检查它们。

更好的方法是创建一个扩展AsynTask的单独类,并定义一个在onPostExecute中触发的回调接口。

创建一个字段来保存所有任务:

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

在MyAsyncTask的onPostExecute上:

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

好吧,你知道AsyncTask什么时候结束(当onPostExecute被调用时):一个解决方案可能是创建一个方法setProgressBarVisible() ,它保持一个计数器,当第一次调用sets时可见,以及一个方法setProgressBarInvisible()减少计数器,当零设置进度条不可见。

: – ? 我认为这只是一个技巧。 你将在每个Asyntask onPostExecute上返回一些消息并进行比较。 (例如,此消息可以包含时间)

自API级别24以来,引入了CompletableFuture的官方支持。

它也可以在Java 8中find 。

可以使用简单的用法:

 taskA.thenCombine(taskB).thenCombine(taskC) 

我只是在onPostExecute()通知它,请参阅onPostExecute和文档中的4个步骤以获取详细信息 ,您可以使用EventBus来做一些订阅。

试试这个,也许可以帮到你……

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