Android AsyncTask在取消时不会停止,为什么?

Oll*_*e C 16 android android-asynctask

我在Activity的onPause生命周期事件中关闭了一个AsyncTask,所以当有人离开应用程序时它不会运行,但它会继续运行,尽管如此.我添加了一些跟踪,这个片段显示了问题.

    Trace.d(TAG,"Task state: " + myTask.getStatus() );
    myTask.cancel(true);
    Trace.d(TAG,"Task state: " + myTask.getStatus() );
Run Code Online (Sandbox Code Playgroud)

输出:

Task state: RUNNING
Task state: RUNNING
Run Code Online (Sandbox Code Playgroud)

为什么cancel()方法对任务的状态没有任何影响?我注意到文档说取消方法将"尝试"停止任务,但在什么情况下会失败?该任务肯定正在运行,因为它每十秒输出一次日志输出,如上所示,其状态将返回为运行状态.

更新:我添加了跟踪以显示isCancelled()状态,并且会更改.所以取消(true)的调用是将取消状态从false更改为true,但显然对Status没有影响,或者停止线程.

Oll*_*e C 2

我更深入地挖掘并记得我的线程正在调用一个包含此内容的编写相当糟糕的方法,在我需要取消的线程中生成另一个线程:

public static void haveASleep(int milliseconds)
{
    try
    {
        Thread.sleep(milliseconds);
    }
    catch (InterruptedException ie)
    {
        Trace.w(TAG,"Sleep interrupted");
    }
}
Run Code Online (Sandbox Code Playgroud)

那么发生的事情就是AsyncTask线程调用这个方法等待一段时间,在睡眠期间AsyncTask上发生了cancel()方法调用,导致线程睡眠出现异常。我的代码徒劳地捕获并吸收了该异常,而不是使用它来关闭 AsyncTask。

解决方案是在睡眠时查找异常,如果抛出异常,则安静地退出线程。该应用程序现在可以按预期工作,但是...

cancel() 方法调用后的状态立即保持为 RUNNING,但我怀疑这是因为此时它仍在运行,并且操作系统尚未将其关闭。我不知道这是否属实,但这是我的最佳估计。