asynctaskスレッドは死ぬことはありません
-
28-09-2019 - |
質問
私は使用しています AsyncTask
sユーザーがボタンを押すことに応じてデータを取得します。これはうまく機能し、データを取得しながらインターフェイスが応答性を維持しますが、Eclipseデバッガーで何が起こっているのかをチェックしたとき、私は新しいものが新しいことを知りました AsyncTask
作成されました(1回しか使用できないため、非常に頻繁に使用されます)、新しいスレッドは作成されていましたが、終了することはありませんでした。
結果は多数です AsyncTask
ただそこに座っているスレッド。これが実際に問題なのかどうかはわかりませんが、それらの余分なスレッドを取り除きたいと思います。
これらのスレッドを殺すにはどうすればよいですか?
解決
AsyncTask
作成されたスレッドプールを管理します ThreadPoolExecutor
. 。 5〜128のスレッドがあります。 5つ以上のスレッドがある場合、これらの追加のスレッドは、削除される前に最大10秒間固執します。 (注:これらの数値は、現在目に見えないオープンソースコード用であり、Androidリリースによって異なります)。
出て AsyncTask
スレッドだけでお願いします。
他のヒント
Commonswareの応答に加えて:
現在、私はAndroid 2.2を使用していますが、私のアプリケーションはいつでも1つ以下のAsynctaskを使用していますが、X分ごとに新しいものを作成しています。最初は新しいAsynctaskスレッドが表示され始めます(新しいAsynctaskの新しいスレッド)が、5つのスレッド(コモンズウェアで言及されているように)の後、デバッグウィンドウに表示され、新しいAsynctaskスレッドが必要なときに再利用されます。デバッガーが切断されるまで、彼らはそこにとどまります。
ここでも同じ症状。私の場合、私はアクティビティを殺した後、スレッドが絞首刑になりました、そして、私はアプリが完全に閉じることを望んでいました。単一のスレッドエグゼキューターを使用して部分的に解決する問題:
myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());
これにより、作業を完了した後にスレッドが消えました。
使用する ThreadPoolexecutor.
BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size
ThreadPoolExecutor executor = new ThreadPoolExecutor(
Runtime.getRuntime().availableProcessors(), // Initial pool size
Runtime.getRuntime().availableProcessors(), // Max pool size
1, // KEEP_ALIVE_TIME
TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT
workQueue);
あなたを投稿してください Runnable
使用によるタスク 実行する() 方法。
void execute (Runnable command)
将来、指定されたタスクを実行します。タスクは、新しいスレッドまたは既存のプールされたスレッドで実行される場合があります
2番目のクエリについて:
これらのスレッドを殺すにはどうすればよいですか?
すべての作業が完了したら ThreadPoolExecutor
, 、以下の投稿で引用されているように適切にシャットダウンします: