首页 文章

取消AsyncTask

提问于
浏览
2

运行的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

    有一些核心方法("blocking methods"),例如 Thread.sleep() ,它们自己检查线程中断并抛出异常 .

  • 2

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

相关问题