【问题标题】:AsyncTask cancel(Boolean) calls onPostExecute -? [duplicate]AsyncTask cancel(Boolean) 调用 onPostExecute -? [复制]
【发布时间】:2012-05-03 09:40:01
【问题描述】:

可能重复:
onPostExecute on cancelled AsyncTask

如果文档说它应该调用onCancelled,为什么取消AsyncTask 仍然调用onPostExecute。 这是一个长期存在的错误吗?

在我的情况下,我 cancel(true) asynctask,它完成 doInBackground 然后调用 onPostExecutes。 最后它抛出一个

java.lang.InterruptedException

如果这是有意的行为,我可以将这个Exception 作为一个对象吗?

【问题讨论】:

  • 实际上异步任务不会立即取消。要使它真正取消,您必须做一些工作并检查是否使用标志概念调用了取消
  • 是的 gunnar 这就是我正在经历的。所以这是一个错误?

标签: android android-asynctask


【解决方案1】:

如果您阅读 cancel() 方法中的文档,您会发现:

尝试取消此任务的执行。此尝试将失败,如果 任务已完成、已被取消或无法 因其他原因被取消。

调用 cancel() 会将 isCancelled() 设置为 true。您是否定期在 doInBackground 中检查此方法的返回值?

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

至于 java.lang.InterruptedException 异常,可能有多种原因。

我的猜测是,您可能在错误的地点/时间调用了 cancel(),并且您可能没有在 doInBackground 中定期检查 isCancelled(),因此任务成功完成并调用了 onPostExecute() .

【讨论】:

    【解决方案2】:

    onPostExecute 之后应该调用onCancelled

    【讨论】:

    • 只有当我用 cancel(false) 停止时,onCancelled() 上肯定没有调用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多