首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android AsyncTask取消后不会停止,为什么?

Android AsyncTask取消后不会停止,为什么?
EN

Stack Overflow用户
提问于 2011-02-11 00:14:02
回答 5查看 14K关注 0票数 16

我有一个在活动的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,但显然不会对状态产生任何影响,或者停止线程。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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,但我怀疑这是因为此时它仍在运行,而操作系统尚未将其关闭。我不知道这是不是真的,但这是我最好的估计。

票数 2
EN

Stack Overflow用户

发布于 2011-07-15 05:04:43

请记住,您的活动和AsyncTask是两个独立的线程。因此,即使您取消了AsyncTask,取消任务的代码也可能还没有运行!这就是为什么你看到AsyncTask在修复了你的bug后仍然在运行。我认为在AsyncTask中的doInBackground()完成之前,状态不会改变。(因此,请确保您正在检查isCancelled(),并在您被取消时提前返回!)

票数 3
EN

Stack Overflow用户

发布于 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);

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4959628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档