取消所有的AsyncTask?

5
我有一个用于获取媒体文件缩略图的类。这个类类似于Loader,为每个ImageView(在SomeAdapter#getView()中调用)启动一个AsyncTask。任务本身会做很多事情,其中之一是调用DiskLruCache,但当SD卡已卸载但任务仍在运行时,应用程序会崩溃。
我知道如何注册卡状态是否改变。
因此,我需要一种方法来停止所有正在运行的任务。任何帮助都将是不错的。

2
有一个任务列表,当您想要取消它们时,只需遍历列表并在每个任务上调用.cancel()。 - Agata
3个回答

8

只需遍历整个列表并使用以下内容,即可取消所有正在运行的异步任务。

if(myAsyncTask.getStatus().equals(AsyncTask.Status.RUNNING))
 {
     myAsyncTask.cancel(true);
 }

3
我知道这个话题很老了。在你的例子中,当你跟踪所有AsyncTask时会起作用:(myAsyncTask = new class().execute()... 但是如果你启动100个mini asyctask而不保留任何引用,像 (new class().execute()...),有没有其他方法来取消引用相同类名的所有asynctask? - nnyerges

2

在每个异步任务上调用cancel()方法,你的异步任务必须检查isCancelled()以返回true,如果是这样,则从doInBackground返回。这都在AsyncTask文档中有说明。

您的解决方案存在一个问题,就是AsyncTasks已知在某些Android设备上并行工作,在其他一些设备上则串行工作。实际上,同时运行它们并不是一个好主意。您可以考虑使用ExecutorService,正如Veaceslav Gaidarji所建议的那样。


1

你可以尝试使用 ExecutorService 在这里看看

这里有很好的示例 - 如何启动异步任务,以及如何在需要时随时停止它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接