我有一个在活动的onPause生命周期事件中关闭的AsyncTask,所以当有人离开应用程序时它不会运行,但它会继续运行。我添加了一些跟踪,这段代码显示了问题所在。
Trace.d(TAG,"Task state: " + myTask.getStatus() );
myTask.cancel(true);
Trace.d(TAG,"Task state: " + myTask.getStatus() );
输出:
Task state: RUNNING
Task state: RUNNING
为什么cancel()方法对任务的状态没有任何影响?我注意到文档说cancel方法将“尝试”停止任务,但是在什么情况下它会失败呢?任务肯定在运行,因为它每隔10秒输出一次日志输出,正如您在上面看到的,它的状态返回为running。
更新:我添加了跟踪功能,以显示isCancelled()状态,但它确实发生了变化。因此,对cancel(true)的调用将取消状态从false更改为true,但显然不会对状态产生任何影响,或者停止线程。
发布于 2011-02-11 02:12:19
我深入挖掘,记得我的线程调用了一个写得相当糟糕的方法,其中包含了这个,在我需要取消的那个线程中产生了另一个线程:
public static void haveASleep(int milliseconds)
{
try
{
Thread.sleep(milliseconds);
}
catch (InterruptedException ie)
{
Trace.w(TAG,"Sleep interrupted");
}
}
所以发生的事情是,cancel线程调用此方法等待一段时间,在休眠期间,AsyncTask上发生了cancel()方法调用,这会导致线程休眠中出现异常。我的代码毫无帮助地捕获并吸收了该异常,而不是使用它来关闭AsyncTask。
解决方案是寻找睡眠时的异常,如果抛出了异常,就静静地退出线程。这个应用现在可以正常工作了,但是...
cancel()方法调用后立即显示的状态仍然是RUNNING,但我怀疑这是因为此时它仍在运行,而操作系统尚未将其关闭。我不知道这是不是真的,但这是我最好的估计。
发布于 2011-07-15 05:04:43
请记住,您的活动和AsyncTask是两个独立的线程。因此,即使您取消了AsyncTask,取消任务的代码也可能还没有运行!这就是为什么你看到AsyncTask在修复了你的bug后仍然在运行。我认为在AsyncTask中的doInBackground()
完成之前,状态不会改变。(因此,请确保您正在检查isCancelled()
,并在您被取消时提前返回!)
发布于 2013-12-25 03:01:36
thread.cancel(true);
仅设置AsyncTask类中的变量。你需要做的是在你的后台任务中实现一个循环。然后,如果每次迭代的cancel为true,则检查并中断循环。
@Override
protected Void doInBackground(Void... params) {
synchronized(this) {
for(int i = 0; i < 9000; i++) {
if(thread.isCancelled()) break;
// do stuff
}
}
}
然后只要在需要停止时将其设置为“已取消”即可。然后,它将在下一次迭代之前停止。
@Override
public void onStop() {
super.onStop();
thread.cancel(true);
}
@Override
public void onDestroy() {
super.onDestroy();
thread.cancel(true);
}
https://stackoverflow.com/questions/4959628
复制相似问题