我有一个下载 android 应用程序的文件。当用户单击 listview 项目时,会下载此文件。它工作正常。现在,我想取消当前文件下载并开始下一个文件,同时用户点击其他项目并且另一个下载已经在进行中,并在取消下载任务之前显示用户确认。
我怎样才能做到这一点?
提前致谢
我有一个下载 android 应用程序的文件。当用户单击 listview 项目时,会下载此文件。它工作正常。现在,我想取消当前文件下载并开始下一个文件,同时用户点击其他项目并且另一个下载已经在进行中,并在取消下载任务之前显示用户确认。
我怎样才能做到这一点?
提前致谢
首先,您必须检查您的AsyncTask
// in doInBackground, check if asynctask is canceled manually
if (isCancelled()) break;
在您的活动中,每当您尝试取消时,只需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();
Cancel(false)
设置一个标志,您可以签入doInBackGround()
并阻止您的代码执行其正在执行的操作。cancel(true)
做同样的事情,除了它也会中断线程。在此处查看有关中断的更多信息。
当您的任务中有循环代码时,这一切都很好。循环的每次迭代,您都可以检查isCancelled()
.
但是正如您的问题一样,某些任务(例如下载文件)不使用循环,也许您只是在调用外部 API 方法,所以在这里,您受制于这种阻塞方法。如果设计得好,它会在中断时抛出异常,线程将终止。
另外,看看更好的实现,SafeAsyncTask