当对话框解散时,是否取消了doInBackground?

时间:2012-12-04 07:02:05

标签: android android-asynctask

我在AsyncTask中有一个自定义进度对话框作为下载进度,我想在按下自定义取消按钮时中断doInBackground。在对话框解散时,doInBackground似乎恢复没有任何问题!

2 个答案:

答案 0 :(得分:1)

您可以从对话框的取消事件中调用AsyncTask.cancel(true)。为此,您需要引用AsyncTask,这可能是在任务启动时初始化的实例变量。然后在asyncTask.doInBackground()方法中,您可以检查isCancelled(),或覆盖onCancelled()方法并停止正在运行的任务。

示例:

//Asynctask instance variable
private YourAsyncTask asyncTask;

//Starting the asynctask
public void startAsyncTask(){
   asyncTask = new YourAsyncTask();
   asyncTask.execute();
}

//Dialog code
loadingDialog = ProgressDialog.show(ThisActivity.this,
                                               "",
                                               "Loading. Please wait...",
                                               false,
                                               true,
                                               new OnCancelListener()
                                               {

                                                 @Override
                                                 public void onCancel(DialogInterface dialog)
                                                 {
                                                   if (asyncTask != null)
                                                   {
                                                     asyncTask.cancel(true);
                                                   }
                                                 }
                                               });

编辑:如果从AsyncTask内部创建对话框,代码就不会有太大差异。你可能不需要实例变量,我想你可以在那种情况下调用YourAsyncTask.this.cancel(true)。

答案 1 :(得分:1)

I want to interrupt doInBackground when my custom cancel button pressed. 

=>在取消按钮单击事件中调用AsyncTask的 cancel() 方法。现在这还不足以取消doInBackground()过程。

例如:

 asyncTask.cancel(true);

要通知您已使用cancel()方法取消了AsyncTask,您必须使用isCancelled() 内的 doInBackground()检查是否已取消。

例如:

protected Object doInBackground(Object... x) 
{
  // do your work...

   if (isCancelled())  
       break;

}