如何使用强力取消AsyncTask

时间:2015-02-09 21:52:00

标签: android multithreading android-asynctask

大多数开发人员都不知道即使活动已经finish()编辑,AsyncTasks也会一直运行直到完成。 一些开发人员知道即使在onStop()中调用asyncTask.cancel(true),AsyncTask仍会运行直到完成,因为.cancel(true)所做的一切都会引发一个标志,我们应该在每次操作之前定期检查在doInBackground中并手动返回。 但是如果我们正在进行长期运行,我们就无法在运营期间进行检查,所以实际上我们什么都不做。

我已经阅读了关于为给定的AsyncTask分配线程ID的提示,因此我们可以立即通过其ID终止该线程。

这可能吗?怎么做?

编辑:当我尝试停止长时间运行的网络操作时,我会这样做:

   while ((line = reader.readLine()) != null) {
                /**
                 * Helps an AyncTask being cancelled to really be cancelled
                 * amidst execution, instead of waiting for the whole network
                 * operation to finish
                 */
                Thread.sleep(1);
                sb.append(line + "\n");
            }

然后我至少可以取消此操作。

2 个答案:

答案 0 :(得分:5)

除非您在操作系统级别完全终止整个应用程序,否则

永远按其ID终止线程。您不知道该线程处于什么状态。它可能会打开文件或其他资源,这会使应用程序处于不一致状态,可能是永久性的。这就是为什么Java的Thread.stop()被弃用的原因。正确的答案是取消异步任务,然后偶尔检查isCanceled,如果返回true则终止自身,给它时间清理自己。除此之外,让任务运行完成更安全。

答案 1 :(得分:0)

onStop()方法中,您可以触发全局布尔值为true或false,并在doInBackground()中设置一个循环以在更改时取消。 From another post:

protected Object doInBackground(Object... x) {
    while (/* condition */) {
        // work...
        if (isCancelled()) break;
    }
    return null;
}