【问题标题】:Cancelling AsyncTask取消异步任务
【发布时间】:2012-07-28 22:16:23
【问题描述】:

正在运行的 AsyncTask 的 .cancel(boolean) 方法是如何工作的?这是文档:

尝试取消此任务的执行。如果任务已完成、已被取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且在调用取消时此任务尚未启动,则此任务不应该运行。如果任务已经开始,则 mayInterruptIfRunning 参数确定是否应该中断执行该任务的线程以尝试停止该任务。

调用此方法将导致在 doInBackground(Object[]) 返回后在 UI 线程上调用 onCancelled(Object)。调用此方法可确保永远不会调用 onPostExecute(Object)。调用此方法后,应定期从 doInBackground(Object[]) 中检查 isCancelled() 返回的值,以尽早完成任务。

第二段暗示程序员在调用取消后尽快从 doInBackground 方法返回(通过定期检查 isCancelled())。但是在测试中,即使我不这样做,我的 AsyncTask (doInBackground 方法)似乎也会在调用取消之后立即停止。谁能解释一下? (顺便说一句,当调用取消时,Logcat 不会显示任何发生的事情)。

protected Void doInBackground(Void... V) {
            for (int v=3;v>0;v--){
                publishProgress(v);
                try {Thread.sleep(1500);} catch (InterruptedException e) {}
            } 
            return null;
         }

此外,无论提供的 mayInrerruptIfRunning 值如何,都会发生这种情况,因此,如果可以解释该值的来源,我们将不胜感激。

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

有一些核心方法(“阻塞方法”),例如Thread.sleep(),它们本身会检查线程中断并抛出异常。

【讨论】:

  • 有趣。但是,即使我将 mayInterruptIfRunning 设置为 false,为什么还会发生这种情况?
  • @lukeuser:我刚刚测试过,cancel(false) 按预期工作(Thread.sleep 没有中断)
  • 对不起,任务没有被停止,我只是以为是,因为我不知道取消任务时不会调用 onProgressUpdate 方法(我很傻)。然而,值得指出的是,如果调用 cancel(true),则 Thread.sleep() 仅在调用 cancel 时正在运行时才会中断(因此,如果您有多个 sleep(),则下一个不会被中断)
【解决方案2】:

您可以在 AsyncTask 的 doInBackground 中检查 isRunning(),如果是,则返回 null。否则只能在 doInBackground 运行后取消。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多