質問

私は使用しています AsyncTasksユーザーがボタンを押すことに応じてデータを取得します。これはうまく機能し、データを取得しながらインターフェイスが応答性を維持しますが、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, 、以下の投稿で引用されているように適切にシャットダウンします:

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top