取消一个ASyncTask

4

AsyncTask 在完成 onPostExecute() 方法时可以被取消吗?或者说一旦 doInBackground() 方法完成,任务就不能再被取消了吗?

2个回答

5
据我理解,任务仅在 doInBackground() 状态下运行,当任务完成且无法取消时,才会在 onPostExecute() 中执行。 cancel() 尝试取消此任务的执行。如果任务已经完成、已经被取消或由于某些其他原因无法取消,则此尝试将失败。 如果成功,并且在调用 cancel 时此任务尚未启动,则此任务不应该运行。如果任务已经启动,则 mayInterruptIfRunning 参数确定是否中断执行此任务的线程,以尝试停止该任务。
调用此方法将导致在UI线程上调用 onCancelled(Object) ,在 doInBackground(Object[]) 返回后。调用此方法保证永远不会调用 onPostExecute(Object) 。 在调用此方法后,您应定期从 doInBackground(Object[]) 检查由 isCancelled() 返回的值,以尽早完成任务。

谢谢,我希望是这样的。 - enifeder

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;
    }
 }

你似乎误读了问题。我不是在问如何使用AsyncTask,而更关注它的内部工作原理。 - enifeder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接