2

静的リストタスク(リストが適切な解決策かどうかはわかりません)を持つTasksManagerがあり、静的メソッドがあるとaddTaskToList(MyTask task){tasks.add(task);}, removeTaskFromList(MyTask task){tasks.remove(task);} します。doInBackground()の各タスクは最初のメソッドを呼び出し、onPostExecute()では「this」を使用した2番目のメソッド呼び出しがあります。MyTaskには文字列フィールド「メソッド」があります。

task.getMethod()。contains( "url")..このコードが安定した作業に十分かどうかわからないこのリストのタスクをキャンセルしたい..タスクのonCancelled()が常に呼び出されるとは限らないように見える、マルチトレッドは危険な場合があるそのような方法のために私は思います。

   for (MyTask task : tasks) {
        if (task.getMethod().contains("url")) {
            task.cancel(true);
            break;
        }
    }

この方法でタスクを保存するのは通常の方法ですか、それとも私にもっとエレガントな提案をすることができますか?

4

1 に答える 1

0

をキャンセルすることAsyncTaskは、必ずしも即時/明白なことではありません。を使用している場合は、を認識しcancelていることを確認する必要があり、自分で行っていたことを停止する必要があります(のドキュメントを参照してください)。 doInBackgroundisCancelledisCancelled

とにかく、オブジェクトのリストを保存し、AsyncTaskそれらを繰り返して連続的なバックグラウンド作業を行うことはお勧めしません。それは非常にすぐに非常に厄介になるかもしれないように聞こえます。それぞれAsyncTaskが新しいを作成しますThread、そしてそれはあなたが望むもののように聞こえません。むしろ、何かを実行できるバックグラウンドスレッドが1つだけ必要な場合がありますか?

次のように、1つのバックグラウンドスレッドに対して、HandlerThreadと独自のLooperを使用できます。

HandlerThread backThread = new HandlerThread("BackLooper", Thread.NORM_PRIORITY);
backThread.start();
Looper backLooper = backThread.getLooper();

private synchronized void runOnBackThread(Runnable r) {
   new Handler(backLooper).post(r);
}

次に、順番に実行する各アイテムを送信して、バックスレッドに投稿できますRunnable。また、他のHandler postバリアント、postDelayed、postAtなども使用できます。

また、実行している内容によっては、IntentServiceが 非常に役立つ場合があります。IntentService「ワークキュー」タイプのパターン用に特別に提供されています。バックグラウンドスレッドが1つあり、呼び出すときに一度に1つずつ実行するように指示したことをすべて実行し、不要な場合は自動的に消えます。

最後に、Android用の非常に優れた一般的な「タスク」タイプのライブラリを探している場合は、Square'sTapeをチェックしてください。それはあなたの質問に直接関係していませんが、Tapeはより堅牢な「キューに入れる」タスクタイプの状況に非常に便利だと思います。

于 2013-01-17T20:11:23.883 に答える