5

メディア ファイルのサムを取得するために使用するクラスがあります。このローダーのようなクラスはAsyncTaskfor every を開始しますImageView( で呼び出されSomeAdapter#getView()ます)。タスク自体は多くのことを行いますが、そのうちの 1 つは を呼び出していますDiskLruCacheが、SD カードがアンマウントされると、タスクがまだ実行されている間にアプリケーションがクラッシュします。

カードの状態が変更された場合の登録方法を知っています。

したがって、実行中のすべてのタスクを停止する方法が必要です。どんな助けでもいいでしょう。

4

3 に答える 3

8

すべてのリストを繰り返し処理し、実行中のすべての asynctask をキャンセルする以下を使用します。

if(myAsyncTask.getStatus().equals(AsyncTask.Status.RUNNING))
 {
     myAsyncTask.cancel(true);
 }
于 2012-10-19T10:09:25.763 に答える
2

各asynctasksでcancel()を呼び出すと、asynctasksはisCancelled()がtrueを返すかどうかを確認し、trueを返す場合はdoInBackgroundから戻る必要があります。これはすべてAsyncTaskのドキュメントにあります。

ソリューションには1つの問題があります。それは、AsyncTasksが一部のAndroidで並列に動作し、他のAndroidでは直列に動作することが知られていることです。それらを並行して実行することは実際には良い考えではありません。Veaceslav Gaidarjiが提案したように、ExecutorServiceの使用を検討することもできます。

于 2012-10-19T10:16:05.530 に答える
1

こちらをご覧くださいExecutorService

良い例があります-非同期タスクを開始する方法と、必要なときにいつでもそれらを停止する方法。

于 2012-10-19T10:12:00.757 に答える