1

WeakReferences途中で知り合ったばかりなので、私は の専門家ではありません。

私は自分の活動Timerで withを使用しています。タイマーは、新しいインスタンスを作成するまで、TimerTask呼び出した後はいつでも再利用できないことが知られています。cancel()

だから私がやっていることはTimer、私の活動でグローバルを作成することです.

Timer timer;

そして私の onResume() の中で、私はそれをインスタンス化しますtimer = new Timer();

この理由は、Timer already cancelled例外を回避するためです。モバイルがスクリーンロックなどを取得したときに onPause() が呼び出される可能性があるため、メソッドで呼び出しtimer.cancel()ていonPause()ます。

私の質問は、タイマーがキャンセルされたときに、Garbage collection再度使用するのはまったく無意味であるため、自動的に起こりやすくなりますか? この場合、どのくらいの速さで収集されますか?

WeakReferencehereを使用すると便利ですか?そうでない場合、どこで使用すると役立ちますか?

4

1 に答える 1

0

Timer が GC される資格に関係なく、WeakReferencetoTimerインスタンスを保持してもメリットはありません。なぜなら、あなたが言ったように、cancel().

WeakReference使用できるオブジェクトを追跡するのに役立ちますが、他の誰も使用しない場合はそのオブジェクトを RAM に保持したくありません (つまり、誰も [ハード] 参照を保持していません)。その後、GCされ、あなたWeakReferenceも役に立たなくなります。(そして、オブジェクトだけを保持することでオブジェクトのGCを防ぐことはできませんWeekReference)。

まあ、あいまいすぎないことを願っています。

私は個人的WeakReferencesに、junit テストでメモリ リークが発生する可能性について大まかな考えを持っていました。

使用例をもう 1 つ挙げることができます。カスタムの内部クラスをクラスでHandler定義する代わりに、カスタムの内部クラスActivityを暗黙的に参照し、Activity潜在的なメモリ リークを作成する可能性があります。カスタムHandler classを静的なネストされたクラスとして定義し、インスタンスをプライベート メンバーとして保持WeakReferenceするActivityことができます。そのため、ActivityカスタムHandlerクラス内から引き続きメソッドを呼び出すことができます。

于 2013-10-28T21:48:57.400 に答える