取消AsyncTask时的onPostExecute函数

32

onPostExecuteAsyncTask被取消时是否执行?

如果它执行了,那么我是否应该始终在onPostExecute开始之前询问任务是否被取消(isCancelled),然后再执行其他操作?


另请参阅此问题 - Dheeraj Vepakomma
3个回答

68

在Android 2和Android 4之间,onPostExecute在cancel()方法上的文档记录行为已更改。

Android 2.3.7 onPostExecute:

在doInBackground之后在UI线程上运行。指定的结果是由doInBackground返回的值,如果任务被取消或发生异常,则为空。

Android 4.0.1 onPostExecute :

在doInBackground之后在UI线程上运行。指定的结果是由doInBackground返回的值。如果任务被取消,则不会调用此方法。

因此,如果您仍然针对Android 2设备,则应假定将调用onPostExecute,并在onPostExecute中检查null结果。


3
非常有用的回答! - Ellen Spertus
如果你取消异步任务,onCancelled方法将被调用。 - Akshatha S R

8

根据我的经验,当任务被取消时,实际上不会调用onPostExecute()方法。但是,在任务的doInBackground()方法完成之后,但在onPostExecute()方法被调用之前,可能会取消任务 - 在这种情况下,实际上会调用onPostExecute()方法。因此,为了确保,我在onPostExecute()方法中调用isCancelled()方法,如果任务已被取消,就只需“返回”。这对我很有效。


1
这是真的吗?我的意思是,我该如何复现它?有任何测试代码或想法吗? - Vit Khudenko
调用此方法可以保证不会随后调用onPostExecute(Object)。 - Joshua Pinter

7

在检查AsyncTask源代码后,似乎即使任务被取消,也会调用onPostExecute。但是,在调用onPostExecute之前,如果任务已被取消,则结果将设置为null (?)。

编辑:@bain提供了更新的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接