2012-05-12 10 views
2

私は、自分のアクティビティのonCreate()メソッドのUIスレッドのハンドラをインスタンス化しています。新しいハンドラonCreate()

1つのハンドラは1つのスレッドに対応しますが、1つのスレッドにはハンドラが増えることがあります(私が見る限り)。 onCreate()を呼び出すたびに、新しいHandlerインスタンスがインスタンス化されます。したがって、私のアクティビティが再び作成された場合(onDestroyの後、その間にプロセスがkillされない)、onCreate()は別のHandlerを追加しますが、古いものは削除されません。 (Androidのソースでは、ハンドラはスレッドのルーパーのみを要求し、そのメッセージキューへの参照を取得します)

最適な解決策は何ですか?静的変数にHandlerをインスタンス化してから、onCreate()でnullかどうかを調べることができます。それが非NULLの場合は、新しいインスタンスをインスタンス化する必要はありません。

(言うまでもなく、onDestroy()では、ハンドラインスタンスのActivity参照をNULLに設定しているため、ハンドラはActivityや何か関連するものを漏らしていません。ハンドラの処理メソッドはヌルかどうかをチェックし、しかし、私の質問は、私が推測する前の段落で説明した理由でハンドラがスレッドのために保持されているということです。つまり、onCreateコールが増えるほど、UIスレッドにHandlerインスタンスが追加されます。 の場合これが重要でない場合、現在のスレッドに関連付けられたハンドラがGC-dであることをAndroidがどのように検出するのですか?)

答えて

4

ハンドラはスレッド、ルーパーなどで参照されません。ハンドラーは、Looperのメッセージキューに物を入れる便利な方法です。

onCreate()でハンドラをインスタンス化し、これをアクティビティのメンバ(インスタンス)変数に割り当てると、アクティビティがガベージコレクトされるとハンドラは参照するものがないため、ガベージコレクションされます。

したがって、onCreate()でハンドラオブジェクトを作成してもメモリリークは発生しません。

関連する問題