ユーザーがボタンを押したことに応答して、AsyncTask
sを使用してデータを取得しています。これはうまく機能し、データのフェッチ中にインターフェイスの応答性を維持しますが、Eclipseデバッガーで何が起こっているのかをチェックすると、新しいAsyncTask
が作成されるたびに(非常に頻繁に、 1回しか使用できません)、新しいスレッドが作成されていましたが、終了することはありませんでした。
結果として、多数のAsyncTask
スレッドがそこに座っています。これが実際に問題になるかどうかはわかりませんが、余分なスレッドを取り除きたいと思います。
これらのスレッドを強制終了するにはどうすればよいですか?
AsyncTask
は、ThreadPoolExecutor
で作成されたスレッドプールを管理します。 5〜128のスレッドがあります。 5つを超えるスレッドがある場合、それらの余分なスレッドは、削除されるまで最大10秒間滞留します。 (注:これらの数値は、現在表示されているオープンソースコード用であり、Android release)によって異なります。
AsyncTask
スレッドはそのままにしてください。
CommonsWareの応答に加えて:
現在、Android 2.2を使用しており、アプリケーションは常に1つ以上のAsyncTaskを使用しませんが、x分ごとに新しいものを作成しています。最初に新しいAsyncTaskスレッドが表示され始めます(新しいAsyncTaskの新しいスレッド)しかし、5つのスレッド(CommonsWareによると)の後、それらはデバッグウィンドウに表示されたままであり、新しい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);
execute() メソッドを使用して、Runnable
タスクを投稿します。
void execute (Runnable command)
将来のある時点で指定されたタスクを実行します。タスクは、新しいスレッドまたは既存のプールされたスレッドで実行できます
2番目のクエリについて:
これらのスレッドを強制終了するにはどうすればよいですか?
ThreadPoolExecutor
のすべての作業が完了したら、以下の投稿で引用されているように適切にシャットダウンします。