【发布时间】:2010-07-26 12:43:58
【问题描述】:
如果AsyncTask 已被取消,onPostExecute 是否会执行?
如果它确实执行了,是否可以肯定地说我应该总是在onPostExecute 开始时询问任务是否已被取消(isCancelled),然后再做任何其他事情?
【问题讨论】:
标签: android multithreading android-asynctask
如果AsyncTask 已被取消,onPostExecute 是否会执行?
如果它确实执行了,是否可以肯定地说我应该总是在onPostExecute 开始时询问任务是否已被取消(isCancelled),然后再做任何其他事情?
【问题讨论】:
标签: android multithreading android-asynctask
onPostExecute 在 cancel() 上的记录行为在 Android 2 和 Android 4 之间发生了变化。
在 doInBackground 之后在 UI 线程上运行。指定的结果是 doInBackground 返回的值,如果任务被取消,则返回 null 或发生异常。
在 doInBackground 之后在 UI 线程上运行。指定的结果是 doInBackground 返回的值。如果出现以下情况,则不会调用此方法 任务已取消。
因此,如果您仍然以 Android 2 设备为目标,您应该假设将调用 onPostExecute 并在 onPostExecute 检查空结果。
【讨论】:
根据我的经验,取消任务时实际上不会调用 onPostExecute()。但是,可以在任务的 doInBackground() 完成后但在调用 onPostExecute() 之前取消任务 - 在这种情况下实际上调用了 onPostExecute()。因此,可以肯定的是,我在 onPostExecute() 中调用 isCancelled() 方法,如果任务已被取消,则只需“返回”。它对我有用。
【讨论】:
在检查 AsyncTask 源代码后,即使任务被取消,似乎也会调用 onPostExecute。但是,如果任务已被取消,则在调用 onPostExecute 之前,结果将设置为 null (?)。
编辑:@bain 提供了更新的answer。
【讨论】: