1

ダウンロードの進行状況として機能する AsyncTask 内にカスタムの進行状況ダイアログがあります。カスタムのキャンセル ボタンが押されたときに doInBackground を中断したいと考えています。ダイアログが閉じると、doInBackground は問題なく再開されるようです。

4

2 に答える 2

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

=>cancel()キャンセルボタンのクリックイベント内でAsyncTaskのメソッドを呼び出します。これは doInBackground() プロセスをキャンセルするには不十分です。

例えば:

 asyncTask.cancel(true);

isCancelled()cancel() メソッドを使用して AsyncTask をキャンセルしたことを通知するには、 insidedoInBackground()を使用してキャンセルされたかどうかを確認する必要があります。

例えば:

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

   if (isCancelled())  
       break;

} 
于 2012-12-04T08:28:52.367 に答える
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) を呼び出すことができると思います。

于 2012-12-04T08:01:15.757 に答える