【发布时间】:2011-02-10 16:14:01
【问题描述】:
我有一个在 Activity 的 onPause 生命周期事件中关闭的 AsyncTask,因此当有人离开应用程序时它不会运行,但尽管如此,它仍会继续运行。我添加了一些跟踪,这个 sn-p 显示了问题。
Trace.d(TAG,"Task state: " + myTask.getStatus() );
myTask.cancel(true);
Trace.d(TAG,"Task state: " + myTask.getStatus() );
输出:
Task state: RUNNING
Task state: RUNNING
为什么 cancel() 方法对任务的状态没有任何影响?我注意到文档说取消方法将“尝试”停止任务,但在什么情况下会失败?该任务肯定正在运行,因为它每十秒输出一次日志输出,并且如您所见,它的状态返回为正在运行。
更新:我添加了跟踪以向我显示 isCancelled() 状态,并且该状态确实发生了变化。所以对 cancel(true) 的调用将取消状态从 false 更改为 true,但显然对状态没有影响,或者停止线程。
【问题讨论】:
-
有没有办法让任务内部的循环检查任务是否被取消,然后简单地退出循环?
-
cancel的返回值是多少?它告诉你它确实取消了它吗?
-
@Joel 是的,我可以这样做,但是当我在其他地方使用 cancel() 方法时,我想了解它为什么没有达到我的预期
-
@Mayra cancel() 方法返回true,表示任务已被取消——这不是真的,任务在调用cancel后每十秒继续给出日志输出。
-
我敢肯定,不害怕深入研究资源的人(我是!)可以找到答案。只有当
finish()被调用时,状态才会设置为FINISHED,这发生在FutureTask使用的内部处理程序中。cancel()和isCancelled()实际上是在该FutureTask成员上调用的。如果该任务被取消,则调用onCancelled()。可以用于测试吗?来源:google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/os/…