2012-10-29 20 views
2

我有一个文件下载android应用程序。当用户点击listview items.Here文件被下载,它工作正常。 现在,我想要取消当前的文件下载并启动下一个文件,同时用户点击其他项目,并且另一个下载已经在进行,并在取消下载任务前显示用户确认。如何取消AsyncTask的当前实例并启动新的?

我该怎么做?

由于提前

+0

的解决方案是在这里http://stackoverflow.com/questions/4748964/android-cancel-asynctask-forcefully –

+0

把'boolean'在preExecute(),并检查它的值。 –

回答

4

首先,你必须在你的AsyncTask

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

检查您activiy,只要你尝试取消,只是取消AsyncTask手动和当然,开始一个新的下载另一个文件!

mDownloadingTask.cancel(true); 
1

简单地说,你的的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(); 
+0

你确定这肯定会完成后台进程吗? –

+0

没有。实际上它只是将标志isCanceled设置为true。您还必须在2种方法doInbackground()和onPostExecute()上检查此标志以禁用所有操作。 –

+0

这就是我想要的,你必须在你的答案中附加这个答案才能完成。 –

0

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

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

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

而且,看看更好的实施方案,SafeAsyncTask