Android - Cancel AsyncTask Forcefully
Android - Cancel AsyncTask Forcefully
我在我的一个活动中实现了AsyncTask:\n
performBackgroundTask asyncTask = new performBackgroundTask(); asyncTask.execute();
\n现在,我需要实现“取消”按钮的功能,所以我必须停止正在运行的任务的执行。我不知道如何停止正在运行的任务(后台任务)。\n所以请建议我,如何强制取消AsyncTask?\n
更新:
\n我发现了同样的Cancel()
方法,但我发现调用cancel(boolean mayInterruptIfRunning)
并不一定会停止后台进程的执行。看起来的情况只是AsyncTask将执行onCancelled(),并且在完成时不会运行onPostExecute()。
在使用AsyncTask时,问题的出现原因和解决方法如下:
问题原因:取决于在AsyncTask中的具体操作。如果是在一个循环中处理大量文件,可以在每个文件处理后检查isCanceled()标志位,如果被取消则跳出循环。如果是一个执行时间很长的单行命令,那么就没有太多办法了。
解决方法:最佳解决方法是不使用AsyncTask的cancel方法,而是使用自己的cancelFlag布尔变量。然后在postExecute中测试该cancelFlag,以决定如何处理结果。
谢谢你提供了详细的描述。不过在我尝试实现时,我阅读了你的答案但没有完全理解。这次我已经实现了相应的操作,AsyncTask成功地被停止。谢谢你提供的帮助。
问题:如何强制取消 AsyncTask?
原因:即使调用了 cancel() 方法,任务仍在后台运行,并且不会执行 onPostExecute() 方法。
解决方法:根据 Romain Guy 的建议,在 doInBackground() 方法中定期检查 isCancelled() 方法的返回值。另外,可以调用 cancel(true) 方法来发送中断信号到后台线程,以便中断可中断的任务。调用 cancel(true) 会执行 onCancelled(Object) 方法,而不是 onPostExecute() 方法。
此外,可以使用 Thread.currentThread.isInterrupted() 方法来检查线程是否被中断,特别适用于没有 AsyncTask 引用的情况下进行长时间循环操作。
关于 "an interrupt will be sent to the background thread, which may help interruptible tasks" 的描述,非中断任务的示例是什么?由于 doInBackground() 方法在不同的线程中运行,该线程在任何情况下都应该是可中断的。这是否意味着调用 cancel(true) 应该始终中断当前运行的线程?为什么还需要使用 isCancelled() 来检查 AsyncTask 是否被停止?
参考 Java 文档以及相关资源,了解更多关于中断线程的信息。
文章如上所述,提供了关于如何强制取消 AsyncTask 的原因和解决方法。
问题:Android - 取消AsyncTask强制执行
原因:在doInBackground方法中没有检查isCancelled()方法,导致即使调用了asynctask.cancel(true)也无法取消AsyncTask的执行。
解决方法:在doInBackground方法中添加isCancelled()的检查,当isCancelled()返回true时,跳出循环。
代码示例:
protected Object doInBackground(Object... x) { while (/* condition */) { // work... if (isCancelled()) break; } return null; }
问题:我应该在哪里调用asynctask.cancel方法?是否需要将取消按钮放在asynctask描述的5个方法中的任意一个中?
回答:在需要取消AsyncTask的地方调用asynctask.cancel方法即可。
问题:isCancelled()始终返回false,即使调用了asynctask.cancel(true)。
回答:在doInBackground方法的开头或结尾,或者在任何地方添加isCancelled()的检查都可以。