0

私は非同期タスクを持っています。ダイアログフラグメントの oncreate ビューで、以下のように asynctask のオブジェクトを作成しています (サンプルコード)

      @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

  cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this);
        }

今onclickで非同期タスクを実行しています

  @Override
public void onClick(View v) {
    if(v==ok)
     {
         if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){
            mHomeActivity.mProgressDialog.show();
        }
         cashInValidatorListner.execute();
    }
    }

このプログレスバーに oncancellistner を追加しました

       @Override
public void onCancel(DialogInterface dialog) {

    if(dialog==mProgressDialog)
    { 
        mDialogExtraOptions.cashInValidatorListner.cancel(true);
        Toast.makeText(getBaseContext(), "Task Cancled", Toast.LENGTH_SHORT).show();
    }
}

初めて非同期タスクをキャンセルすると、キャンセルされますが、もう一度実行すると、既に実行されたタスクを実行できないというエラーが表示されます。

ユーザーがOKボタンをクリックするたびにonclickでオブジェクトを作成しようとすると、このように問題が解決されます

        @Override
public void onClick(View v) {
    if(v==ok)
     {
         if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){
            mHomeActivity.mProgressDialog.show();
        }
           cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this);
         cashInValidatorListner.execute();
    }
    }

ここでは問題なく動作します。最初のケースで 2 回目に実行したときに非同期タスクが実行されなかったのはなぜですか?

4

2 に答える 2

2

インスタンスの存続期間中に Asynctask を実行できるのは 1 回だけです。これは、Asynctask オブジェクトの新しいインスタンスを作成し、新しく作成したオブジェクトを実行するだけで解決できます。

 (new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this)).execute();
于 2013-07-01T10:49:11.693 に答える
0

ドキュメントから引用します。

タスクは 1 回だけ実行できます (2 回目の実行を試みると、例外がスローされます)。

IllegalStateException が発生しCannot execute task: the task is already runningます。

AsyncTaskインスタンスは一度しか使用できません。

スレッド化ルールの下のトピックを確認してください。

http://developer.android.com/reference/android/os/AsyncTask.html

asynctask 呼び出しをキャンセルするにはcashInValidatorListner,cancel(true)

cancel(true) を呼び出すと、バックグラウンド スレッドに割り込みが送信され、割り込み可能なタスクに役立つ場合があります。それ以外の場合は、 doInBackground() メソッドで isCancelled() を定期的にチェックするようにしてください。

protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
 }

ソース: Android - AsyncTask を強制的にキャンセルする

public final boolean cancel (boolean mayInterruptIfRunning)

このタスクの実行をキャンセルしようとします。タスクがすでに完了している、キャンセルされている、または他の理由でキャンセルできなかった場合、この試行は失敗します。成功し、キャンセルが呼び出されたときにこのタスクが開始されていない場合、このタスクは決して実行されません。タスクがすでに開始されている場合、mayInterruptIfRunning パラメータは、タスクを停止するために、このタスクを実行しているスレッドを中断する必要があるかどうかを決定します。

isCancelled() を使用する

public final boolean isCancelled ()

このタスクが正常に完了する前にキャンセルされた場合は true を返します。タスクで cancel(boolean) を呼び出している場合は、このメソッドによって返される値を doInBackground(Object[]) から定期的にチェックして、できるだけ早くタスクを終了する必要があります。

于 2013-07-01T10:59:22.883 に答える