Androidでasynctaskスレッドを停止する方法は?

android android-asynctask
Androidでasynctaskスレッドを停止する方法は?

別の「AsyncTask」スレッドから「AsyncTask」スレッドを停止したい。 「new AsyncTask.cancel(true)」のようにバックグラウンドプロセスを停止しようとしましたが、停止しませんでした。

誰もこれで私を助けることができますか?

  49  10


ベストアンサー

アクティビティでasyncTaskを宣言します。

private YourAsyncTask mTask;

次のようにインスタンス化します。

__

mTask = new YourAsyncTask().execute();

__

次のようにキル/キャンセルします。

__

mTask.cancel(true);

__

95


処理が停止しない理由は、プロセス(doInBackground())が完了するまで実行されるためです。 したがって、何かを行う前に、スレッドがキャンセルされているかどうかを確認する必要があります。

if(!isCancelled()){
// Do your stuff
}

したがって、基本的には、スレッドがキャンセルされていない場合はキャンセルし、そうでない場合はスキップします
🙂 Could be useful to check for this some times during your operation,
特に物を撮る前に。

また、少し「クリーンアップ」すると便利です

onCancelled();

AsyncTaskのドキュメント:

お役に立てれば!

20


また、「Activity」ライフサイクルの「onPause」または「onDestroy」で使用する必要がある場合があります。

//you may call the cancel() method but if it is not handled in doInBackground() method
if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED)
    loginTask.cancel(true);

ここで、「loginTask」は「AsyncTask」のオブジェクトです

ありがとうございました。

10


asynctaskをすぐに強制終了することはできません。 停止するには、まずキャンセルする必要があります。

task.cancel(true);

また、asynctaskの* doInBackground()*メソッドで、既にキャンセルされているかどうかを確認します。

isCancelled()

存在する場合は、手動で実行を停止します。

6


同様の問題がありました-基本的に、ユーザーがフラグメントを破棄した後、非同期タスクでNPEを取得していました。 Stack Overflowの問題を調査した後、次のソリューションを採用しました。

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


public void onDestroy() {
    super.onDestroy();

    running=false;
    ...
}

次に、非同期コードで定期的に「実行中」をチェックします。 私はこれをストレステストしました、そして今、私は私の活動を「破る」ことができません。 これは完全に機能し、SOで見たソリューションのいくつかよりも単純であるという利点があります。

0


uは一度onCancelled()をチェックできます:

保護されたオブジェクトdoInBackground(Object …​ バツ) \{

while (/* condition */) {
  if (isCancelled()) break;
}
return null;

}

-4


タイトルとURLをコピーしました