簡體   English   中英

在Android中取消AsyncTask

[英]Cancelling AsyncTask in Android

我在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();

記錄時,我發現執行onPostExecute()條件后,該對話框已關閉(調用onDismissListener onPostExecute() 如何正確取消此任務?

我的意圖是通過按后退按鈕來取消任務,無論任務是否完成。 是否可以從其onPostExecute()取消AsyncTask?

實際上,您的代碼看起來正確,

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並僅保持boolean Flag僅取消按下時的對話框,而AsyncTask的onPostExecute()決定使用您的boolean標志條件處理結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM