【发布时间】:2017-08-30 10:26:07
【问题描述】:
我正在处理相当多的遗留 AsyncTask 代码,并且我自己也必须在我们的代码库中编写一些代码。但是,仔细阅读文档中的cancel() 方法让我有些困惑。文档说:
尝试取消此任务的执行。 如果出现以下情况,此尝试将失败 任务已完成、已被取消或无法 因其他原因而被取消。 如果成功,并且此任务已 调用取消时未启动,此任务不应运行。如果 任务已经开始,然后
mayInterruptIfRunning参数 确定执行此任务的线程是否应该是 试图停止任务而被打断。调用这个方法会导致
onCancelled(Object)被调用 在doInBackground(Object[])返回后的 UI 线程上。调用这个 方法保证永远不会调用onPostExecute(Object)。后 调用此方法,您应该检查返回的值isCancelled()定期从doInBackground(Object[])完成 尽早完成任务。
因此,可能存在 AsyncTask 已完成并从doInBackground() 返回但在调用onPostExecute() 之前通过cancel() 取消的任务,这导致调用onPostExecute()。如果取消是从onPause() 或Activity 发起的,这可能会很危险。
此外,关于 SO 的这个问题支持记录在案的取消行为:onPostExecute on cancelled AsyncTask
那么,我应该从现在开始在onPostExecute() 的开头检查if(isCanceled()) 吗?
【问题讨论】:
-
"因此,可能存在 AsyncTask 已完成并从 doInBackground() 返回但在调用 onPostExecute() 之前通过 cancel() 取消任务的情况,从而导致调用 onPostExecute( ) 无论如何。如果取消是从 Activity 的 onPause() 启动的,这可能会很危险。”你遇到过这种情况吗?
-
@ProgrammingPirate :这是用于企业生产的代码。如果至少在官方文档中有记录,我该如何承担风险?
-
@ProgrammingPirate :另外,由于这是一个多线程场景,捕捉场景可能并不容易。