正在运行的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的值是多少,都会发生这种情况,所以如果可以解释这个值的来源,那也非常感激。
答案 0 :(得分:2)
有一些核心方法(“阻塞方法”),例如Thread.sleep()
,它们自己检查线程中断并抛出异常。
答案 1 :(得分:0)
您可以在AsyncTask的doInBackground中检查isRunning()
,如果是,则返回null。否则,您只能在doInBackground运行后取消它。