2015-02-09 31 views
1

大多数开发人员不知道,即使活动已被finish() -ed,AsyncTasks启动它直到完成。 一些开发人员知道,即使在onStop()中您拨打asyncTask.cancel(true),AsyncTask仍会运行直到完成,因为所有.cancel(true)都会提出一个标志,我们应该在每次操作前定期检查并在doInBackground之前手动返回。 但是,如果我们正在进行长时间运行的操作,我们无法在操作持续时间内进行检查,所以我们无效。如何使用蛮力取消AsyncTask

我读过关于给给定的AsyncTask分配一个线程ID的提示,所以我们可以通过它的ID立即终止线程。

这可能吗?它是如何完成的?

编辑:这是我做什么,当我试图阻止长时间运行的网络操作:

​​

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

回答

5

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

+0

如何从我们需要显示到ImageView的互联网上下载的图像,但在用户离开此画面 - 这是资源的完全浪费。我真的希望能够取消这个 – 2015-02-09 21:59:41

+0

我已经编辑了我的问题,以便我停止网络操作 – 2015-02-09 22:02:03

+0

无关紧要 - 无法知道在某个点取消线程是否会导致全局性问题变量在HTTP堆栈中,或者持有一个会使其他线程死锁的信号量。更不用说AsyncTasks共享线程,因此停止线程可能会破坏所有其他异步任务。现在有可能您的http堆栈可能具有取消功能。如果是这样的话应该是安全的,让你的任务覆盖取消调用它(并记得打电话super.cancel()) – 2015-02-09 22:04:36

0

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

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

这不是“使用蛮力”的方法,所以你没有提供OP问题的答案。 – 2015-02-09 21:58:34