2

AsyncTaskAndroidアプリケーションで使用しています。

これが私の仕事です:

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(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 がブール フラグ条件を使用して結果をどう処理するかを決定することをお勧めします。

于 2012-09-04T06:48:18.583 に答える