取消AsyncTask

时间:2012-07-28 22:16:23

标签: android android-asynctask

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

  

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

     

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

第二段暗示程序员在取消被调用之后尽快从doInBackground方法返回(通过定期检查isCancelled())。但是在测试中,在调用cancel之后,即使我不这样做,我的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的值是多少,都会发生这种情况,所以如果可以解释这个值的来源,那也非常感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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