112

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

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

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

4

4 に答える 4

202

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

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

于 2010-06-19T22:37:57.563 に答える
24

CommonsWareの応答に加えて:

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

于 2010-12-14T17:24:56.810 に答える
4

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

    myActiveTask.executeOnExecutor(Executors.newSingleThreadExecutor());

これにより、作業が完了した後にスレッドが消えました。

于 2014-01-25T16:27:07.657 に答える
0

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

javaExecutorServiceを適切にシャットダウンする方法

于 2017-10-06T17:28:27.477 に答える