如何取消AsyncTask的当前实例并启动新的实例?

时间:2012-10-29 03:59:30

标签: android android-asynctask

我有一个下载android应用程序的文件。当用户点击listview项目时,下载了这个文件。工作正常。 现在,我想取消当前文件下载并启动下一个文件,同时用户点击其他项目,另一个下载已经在进行,并在取消下载任务之前显示用户确认。

我该怎么做?

先谢谢

3 个答案:

答案 0 :(得分:5)

首先,您必须签入AsyncTask

// in doInBackground, check if asynctask is canceled manually 
if (isCancelled()) break;

在您的活动中,每当您尝试取消时,只需手动取消AsyncTask,当然,开始新的下载另一个文件!

mDownloadingTask.cancel(true);

答案 1 :(得分:2)

简单地说,您将Asynctask存储到变量:

mDownloadingTask = new Asynctask(){...};
mDownloadingTask.execute();

如果要停止此任务并启动新任务:

//close the current task if it # null
mDownloadingTask.cancel(true);
mDownloadingTask = null;
//Start new one
mDownloadingTask = new Asynctask(){...};
mDownloadingTask.execute();

答案 2 :(得分:0)

Cancel(false)设置一个标记,您可以在doInBackGround()中检查并停止代码执行其操作。 cancel(true)执行相同操作,但它也会中断线程。查看有关中断here的更多信息。

当你的任务中有一个循环代码时,这一切都很好。循环的每次迭代,您都可以检查isCancelled()

但是在你的问题中,像下载文件这样的任务不使用循环,也许你只是调用外部API方法,所以在这里,你受这种阻塞方法的摆布。如果设计得很好,它会在中断时抛出异常,并且线程将终止。

另外,请看一下更好的实现,SafeAsyncTask