13

実行中の非同期タスクを停止する最良の方法を知りたいです。

私が試してみました

@Override protected void onCancelled() { 
      super.onCancelled(); 
      mTask.cancel(true);       
 }

私も試しました

asyncTaskObject.cancel(true);

これは、イベントに関連付けられている場合に特に機能します。

しかし、シナリオが --- 4 つの AsyncTask があるとします。最初に 2 番目を呼び出し、2 番目が 3 番目を呼び出し、3 番目が 4 番目を呼び出します。ユーザーがアクティビティに入ると、ダイアログボックスはありません。そうでなければ、そこで onCancel メソッドを使用できたはずです。ユーザーがページ上の任意の場所をクリックすると、ダイアログ ボックスが表示され、ユーザーがどこもクリックしない場合、ダイアログ ボックスは表示されませんが、非同期タスクはバックグラウンドで実行され続けます。ユーザーが [戻る] ボタンまたはホームへのナビゲーション アイコンをクリックするとします。ページ user.is は現在のアクティビティから取り出されます。しかし、非同期タスクはバックグラウンドで実行され続け、最終的にアプリがクラッシュします。onBackPressed の cancel メソッドに慣れました。しかし、問題は、どのタスクが実行されているかを確認できず、アプリが再びクラッシュすることです。

これから抜け出す方法は何ですか?

4

3 に答える 3

19

AsyncTask オブジェクトへの参照をインスタンス変数として保持し、次に onDestroy() でこれを行います

@Override
protected void onDestroy() {
    if (mTask != null) {
        mTask.cancel(true);
    }

    super.onDestroy();
}
于 2012-11-27T13:18:54.787 に答える
4

http://developer.android.com/reference/android/os/AsyncTask.htmlには、AsyncTasks インスタンスを UI スレッドで作成し、実行を UI スレッドで呼び出す必要があることを示す Threading rules と呼ばれるセッションがあります。UI スレッドから execute を呼び出すと、yourTaskInstance.cancel(true); を呼び出すスレッドをキャンセルできます。

于 2012-11-27T13:24:43.847 に答える
0

いつタスクをキャンセルしたいのか完全にはわかりませんが、いくつかの提案があります: a) 実行中の各タスクへの参照を保持します。b)ダイアログに却下リスナーを追加し、そこですべてのタスクをキャンセルします(それが必要な場合)。c) アクティビティの onStop コールバックですべてのタスクをキャンセルします (もう一度やりたい場合)。

于 2012-11-27T13:22:28.150 に答える