2

AsyncTask在我的 Android 应用程序中使用。

这是我的任务:

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(). 如何正确取消此任务?

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

4

1 回答 1

1

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

In ProgressDialog的OnCancel()

在调用myTask.cancel(true);方法之后,将在之后调用onCancelled(Object), 而不是 ) 。onPostExecute(ObjectdoInBackground(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 使用您的布尔标志条件决定如何处理结果。

于 2012-09-04T06:48:18.583 回答