2011-07-01 77 views
7

私のアプリケーションでは、バックグラウンドスレッドで実行する必要があるコンポーネント間で共有されるいくつかの操作に対して、HandlerThreadを使用しています。ほとんどの場合、このスレッドは待機状態になります。HandlerThreadを終了する必要がありますか?

HandlerThreadを実行中(待機中)のままアプリケーションに送信し、必要に応じてメッセージを送信できますが、HandlerThread.getLooper().quit()で終了しないでください。これは、すべてのアプリケーションコンポーネントが破棄された後でも、このHandlerThreadが待機状態にあり続けることを意味します。

当初、これは私にとって大きなノーと思われました。私は間違いなくやりたいことですが、今は分かりません。 AndroidがCPU時間やメモリを解放する必要があるように私のプロセスを殺すと、このスレッドは私のUIスレッドと共に終了します。さらに、スレッドは待機しているので、CPU時間を消費することはありません。それを超えて、私のアプリケーションは多くのものを利用しています。AsyncTasks、私はスレッドプールを利用しています。私の理解では、AsyncTaskは、アプリケーションライフサイクルコールバック(プール内のスレッドは使用されていないときに待機しているだけです)には準拠していないThreadPoolExecutorを利用しています。

複数のアプリケーションコンポーネントにまたがってHandlerThreadを使用することはできますか?使用しないときには、ひどい悪影響を被りません。

答えて

1

私の個人的な好みは、必要なときにいつでも新しいスレッドを作成し、完了したらそれをクリーンアップすることです。この方法では、同じスレッドを同時に使用しようとしている複数のコンポーネントに問題はなく、「クリーン・シップ」を維持します。また、Androidにはこれを簡単にできる素敵なAsyncTaskがあります。

これは、スレッドへのアクセスを規制し、アクティビティが破棄されたときに正しくクリーンアップされるという条件で、複数のコンポーネントに対してハンドラスレッドを再利用できない理由はありません。私がthis postを正しく理解していれば、あなたのプロセスは実行中である可能性があるため、すべてのアクティビティが終了してもスレッドは実行され続けるかもしれません。これを解決するには、スレッドをデーモンスレッドとして設定することができます。デーモンスレッドは、アプリケーション内の最後の非デーモンスレッドが終了すると自動的に破棄されます。

あなたが別のスレッドで実行する必要があります事を多くの時間のために行われている場合、多数のスレッドを作成しますのでところで、代わりにあなたも、私はあなたの意見に反対するThreadPoolExecutor

+0

を使用して検討する必要がありますおそらくアプリをクラッシュさせるでしょう。 –