Android 如何使用暴力取消异步任务

Android 如何使用暴力取消异步任务,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,大多数开发人员不知道,即使活动已finish()-ed,它启动的异步任务也会一直运行到完成。 一些开发人员知道,即使在onStop()中调用asyncTask.cancel(true),asyncTask仍将运行直到完成,因为.cancel(true)所做的只是在doInBackground中的每个操作之前发出一个标志,我们应该定期检查并手动返回。 但是,如果我们正在执行长期运行的操作,我们无法在操作持续时间内执行此检查,因此实际上我们什么也不做 我已经阅读了一条关于为给定异步任务分配线程ID的

大多数开发人员不知道,即使活动已
finish()
-ed,它启动的异步任务也会一直运行到完成。 一些开发人员知道,即使在
onStop()
中调用
asyncTask.cancel(true)
,asyncTask仍将运行直到完成,因为
.cancel(true)
所做的只是在
doInBackground
中的每个操作之前发出一个标志,我们应该定期检查并手动返回。 但是,如果我们正在执行长期运行的操作,我们无法在操作持续时间内执行此检查,因此实际上我们什么也不做

我已经阅读了一条关于为给定异步任务分配线程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");
            }

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

永远不要通过线程的id杀死线程,除非您在操作系统级别完全终止整个应用程序。您不知道线程处于什么状态。它可能会打开文件以供写入或其他资源,这将使应用程序处于不一致的状态,可能是永久性的。这就是为什么Java的Thread.stop()被弃用的原因。正确的答案是取消异步任务,然后偶尔取消任务检查,如果返回true,则在给它时间清理自己之后终止它自己。除此之外,让任务运行到完成更安全。

永远不要通过线程id杀死线程,除非您在操作系统级别完全终止整个应用程序。您不知道线程处于什么状态。它可能会打开文件以供写入或其他资源,这将使应用程序处于不一致的状态,可能是永久性的。这就是为什么Java的Thread.stop()被弃用的原因。正确的答案是取消异步任务,然后偶尔取消任务检查,如果返回true,则在给它时间清理自己之后终止它自己。在
onStop()
方法中,您可以将全局布尔值触发为true或false,并在
doInBackground()
中设置一个循环以在更改时取消

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


这不是“使用暴力”方法,因此您没有提供OP问题的答案。这不是“使用暴力”方法,因此您没有提供OP问题的答案。从internet下载一张我们需要显示在imageview中的图像,但用户离开此屏幕,这完全是浪费资源。我真的很想取消这个问题,我已经用我所做的来编辑了我的问题,以停止网络操作不要紧-你不知道在某个时候取消线程是否会使HTTP堆栈中的全局变量出错,或者持有一个会使其他线程死锁的信号量。更不用说异步任务共享线程,因此停止线程可能会中断所有其他异步任务。现在,您的http堆栈可能具有取消功能。如果是这样的话,让您的任务覆盖cancel来调用它应该是安全的(记住调用super.cancel())从internet下载一个图像,我们需要将其显示到imageview中,但是用户离开了这个屏幕-这完全是浪费资源。我真的很想取消这个问题,我已经用我所做的来编辑了我的问题,以停止网络操作不要紧-你不知道在某个时候取消线程是否会使HTTP堆栈中的全局变量出错,或者持有一个会使其他线程死锁的信号量。更不用说异步任务共享线程,因此停止线程可能会中断所有其他异步任务。现在,您的http堆栈可能具有取消功能。如果是这样的话,让您的任务覆盖cancel来调用它应该是安全的(记住调用super.cancel()
protected Object doInBackground(Object... x) {
    while (/* condition */) {
        // work...
        if (isCancelled()) break;
    }
    return null;
}