如何使用暴力取消 AsyncTask
How to cancel an AsyncTask using brute force
大多数开发人员不知道,即使 activity 已经被 finish()
编辑,AsyncTasks 由它启动 运行 直到完成。
一些开发人员知道,即使在 onStop()
中调用 asyncTask.cancel(true)
,AsyncTask 仍将 运行 直到完成,因为 .cancel(true)
所做的只是举起一个标志,我们应该定期在 doInBackground
和 return 中的每个操作之前手动检查。
但是如果我们执行一个长运行ning操作,我们不能在操作持续时间内做这个检查,所以实际上我们什么都不做。
我已经阅读了有关为给定 AsyncTask 分配线程 ID 的提示,因此我们可以立即通过其 ID 终止线程。
这可能吗?它是怎么做到的?
编辑:这是我尝试停止长运行ning 网络操作时所做的事情:
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");
}
然后我至少可以取消这个操作
从不 通过线程 ID 终止线程,除非您在 OS 级别完全终止整个应用程序。您不知道该线程处于什么状态。它可能打开文件以进行写入或其他资源,这将使应用程序处于不一致状态,可能是永久状态。这就是 Java 的 Thread.stop() 被弃用的原因。正确的答案是取消异步任务,然后让任务偶尔检查 isCanceled 并在它 returns 为真时自行终止,然后给它时间清理自己。总之,让任务运行完成比较安全。
在您的 onStop()
方法中,您可以将全局布尔值触发为 true 或 false,并在 doInBackground()
中设置一个循环以在更改时取消。 From another post:
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}
大多数开发人员不知道,即使 activity 已经被 finish()
编辑,AsyncTasks 由它启动 运行 直到完成。
一些开发人员知道,即使在 onStop()
中调用 asyncTask.cancel(true)
,AsyncTask 仍将 运行 直到完成,因为 .cancel(true)
所做的只是举起一个标志,我们应该定期在 doInBackground
和 return 中的每个操作之前手动检查。
但是如果我们执行一个长运行ning操作,我们不能在操作持续时间内做这个检查,所以实际上我们什么都不做。
我已经阅读了有关为给定 AsyncTask 分配线程 ID 的提示,因此我们可以立即通过其 ID 终止线程。
这可能吗?它是怎么做到的?
编辑:这是我尝试停止长运行ning 网络操作时所做的事情:
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");
}
然后我至少可以取消这个操作
从不 通过线程 ID 终止线程,除非您在 OS 级别完全终止整个应用程序。您不知道该线程处于什么状态。它可能打开文件以进行写入或其他资源,这将使应用程序处于不一致状态,可能是永久状态。这就是 Java 的 Thread.stop() 被弃用的原因。正确的答案是取消异步任务,然后让任务偶尔检查 isCanceled 并在它 returns 为真时自行终止,然后给它时间清理自己。总之,让任务运行完成比较安全。
在您的 onStop()
方法中,您可以将全局布尔值触发为 true 或 false,并在 doInBackground()
中设置一个循环以在更改时取消。 From another post:
protected Object doInBackground(Object... x) {
while (/* condition */) {
// work...
if (isCancelled()) break;
}
return null;
}