我有一个文件下载android应用程序。当用户点击listview items.Here文件被下载,它工作正常。 现在,我想要取消当前的文件下载并启动下一个文件,同时用户点击其他项目,并且另一个下载已经在进行,并在取消下载任务前显示用户确认。如何取消AsyncTask的当前实例并启动新的?
我该怎么做?
由于提前
我有一个文件下载android应用程序。当用户点击listview items.Here文件被下载,它工作正常。 现在,我想要取消当前的文件下载并启动下一个文件,同时用户点击其他项目,并且另一个下载已经在进行,并在取消下载任务前显示用户确认。如何取消AsyncTask的当前实例并启动新的?
我该怎么做?
由于提前
首先,你必须在你的AsyncTask
// in doInBackground, check if asynctask is canceled manually
if (isCancelled()) break;
检查您activiy,只要你尝试取消,只是取消AsyncTask
手动和当然,开始一个新的下载另一个文件!
mDownloadingTask.cancel(true);
简单地说,你的的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();
你确定这肯定会完成后台进程吗? –
没有。实际上它只是将标志isCanceled设置为true。您还必须在2种方法doInbackground()和onPostExecute()上检查此标志以禁用所有操作。 –
这就是我想要的,你必须在你的答案中附加这个答案才能完成。 –
Cancel(false)
设置一个国旗,您可以在doInBackGround()
中查看,并停止您的代码执行其操作。 cancel(true)
也会执行相同的操作,但它也会中断该线程。查看更多关于中断的信息here。
当你的任务中有一个循环代码时,这是很好的。每循环一次,您可以检查isCancelled()
。
但在你的问题中,像下载文件这样的一些任务不使用循环,也许你只是调用一个外部API方法,所以在这里,你是在这个阻塞方法的摆布。如果设计良好,它会在中断时抛出异常,并且线程将终止。
而且,看看更好的实施方案,SafeAsyncTask
的解决方案是在这里http://stackoverflow.com/questions/4748964/android-cancel-asynctask-forcefully –
把'boolean'在preExecute(),并检查它的值。 –