2

正在运行的 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 值如何,都会发生这种情况,因此如果可以解释该值的来源,那也将非常感激。

4

2 回答 2

2

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

于 2012-07-28T22:22:18.647 回答
0

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

于 2012-07-28T22:25:00.090 回答