取消ASyncTask

时间:2012-07-24 06:10:41

标签: android

完成AsyncTask时可以取消onPostExecute()吗?

或者,一旦doInBackground()完成,任务就不能再被取消了吗?

2 个答案:

答案 0 :(得分:5)

根据我的理解,该任务仅在doInBackground()状态下运行,onPostExecute()表示任务已完成且无法取消。

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

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

答案 1 :(得分:1)

覆盖onCanceled()方法,请参阅以下示例代码:

private class UpdateTask extends AsyncTask<Void, Void, Void> {

    private boolean running = true;

    @Override
    protected void onCancelled() {
        running = false;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
        onUpdate();
    }

    @Override
    protected Void doInBackground(Void... params) {
         while(running) {
             publishProgress();
         }
         return null;
    }
 }