web-dev-qa-db-ja.com

AsyncTaskスレッドが死ぬことはありません

ユーザーがボタンを押したことに応答して、AsyncTasksを使用してデータを取得しています。これはうまく機能し、データのフェッチ中にインターフェイスの応答性を維持しますが、Eclipseデバッガーで何が起こっているのかをチェックすると、新しいAsyncTaskが作成されるたびに(非常に頻繁に、 1回しか使用できません)、新しいスレッドが作成されていましたが、終了することはありませんでした。

結果として、多数のAsyncTaskスレッドがそこに座っています。これが実際に問題になるかどうかはわかりませんが、余分なスレッドを取り除きたいと思います。

これらのスレッドを強制終了するにはどうすればよいですか?

112
Computerish

AsyncTaskは、ThreadPoolExecutorで作成されたスレッドプールを管理します。 5〜128のスレッドがあります。 5つを超えるスレッドがある場合、それらの余分なスレッドは、削除されるまで最大10秒間滞留します。 (注:これらの数値は、現在表示されているオープンソースコード用であり、Android release)によって異なります。

AsyncTaskスレッドはそのままにしてください。

201
CommonsWare

CommonsWareの応答に加えて:

現在、Android 2.2を使用しており、アプリケーションは常に1つ以上のAsyncTaskを使用しませんが、x分ごとに新しいものを作成しています。最初に新しいAsyncTaskスレッドが表示され始めます(新しいAsyncTaskの新しいスレッド)しかし、5つのスレッド(CommonsWareによると)の後、それらはデバッグウィンドウに表示されたままであり、新しいAsyncTaskスレッドが必要なときに再利用されます。

24
Tom de Waard

ここで同じ症状。私の場合、アクティビティを殺した後、スレッドがぶら下がり、アプリが完全に閉じることを望んでいました。シングルスレッドエグゼキューターを使用することで部分的に解決された問題:

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());

これにより、スレッドはその作業の完了後に消滅しました。

3
karnbo

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のすべての作業が完了したら、以下の投稿で引用されているように適切にシャットダウンします。

適切にシャットダウンする方法Java ExecutorService

0
Ravindra babu