取消Android中的AsyncTask

时间:2012-09-04 06:42:51

标签: java android android-asynctask

我在Android应用程序中使用AsyncTask

这是我的任务:

public class MyTask extends AsyncTask<String, String, Boolean> {
    private ProgressDialog progressDialog;
    private boolean isCancelled = false;
    public MyTask(ProgressDialog progressDialog) {
        this.progressDialog = progressDialog;
    }

    @Override
    protected Boolean doInBackground(String... params) {
        try {
            if (!isCancelled()) {
                isCancelled = false;
            } else
                isCancelled = true;
        } catch (Exception e) {

            isCancelled = true;
        }
        return isCancelled;
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        isCancelled = true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        progressDialog.dismiss();
        if (!isCancelled) {
            // start an activity
        }
    }
}

我想在按设备的后退按钮时取消此任务并取消ProgressDialog,但此任务会快速执行。按下后退按钮时,ProgressDialog被取消,但任务完成。

从这样的活动调用此AsyncTask

ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading");
progressDialog.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        if (myTask!= null
                && myTask.getStatus() != AsyncTask.Status.FINISHED
                && !myTask.isCancelled()) {
        myTask.cancel(true);
        }                       
    }
});

progressDialog.show();
myTask = new MyTask(progressDialog);
myTask.execute();

记录时,我发现在执行onDismissListener条件后,对话框被解除(调用onPostExecute())。如何正确取消此任务?

我的意图是用后退按钮取消任务,无论任务是否完成。是否可以从onPostExecute()

取消AsyncTask

1 个答案:

答案 0 :(得分:1)

实际上,您的代码看起来不对,

In ProgressDialog的OnCancel()

在调用myTask.cancel(true);方法onCancelled(Object)之后,而不是 onPostExecute(Object之后将调用doInBackground(Object[])}。

注意:

If you call cancel(true), an interrupt will be sent to the background thread, 
which may help interruptible tasks. Otherwise, you should simply make sure to check
isCancelled() regularly in your doInBackground() method. 

您可以在http://code.google.com/p/shelves找到相关示例。

但是我建议你不要取消AsyncTask,只是保持你的布尔标志只关闭后退按下的对话框,并且onPostExecute() AsyncTask决定如何使用你的布尔标志条件对结果做什么。