2012-04-11 16 views
0

ここで私はメモリリークに夢中になっていて、実際に何が1つにつながるか理解していないのです(そして普通のリンク、例えばhttp://kohlerm.blogspot.co.uk/2009/02/memory-leaks-are-easy-to-find.htmlを読んでいます)。onDestroy()には何が入っていなければなりませんか? (もし何かあれば)

PhoneStateListenerサブクラスをアクティビティ内に残しておくなど、いくつかの目的で作成しようとしましたが、DDMSヒープやMATの通常の状態では何も表示されませんでした。しかし、私は何度も何度も何度も繰り返し読んでいます.Destroyでも登録解除する必要があるだけでなく、onPause(PhoneStateListener() isn´t finished

質問:そのようなリストはありますか? ボーナス質問:それは本当それはonPause/onDestroyなどを登録解除しない限りだPhoneStateListenerが

UPDATEリークを作成することです:を私は修正立っています。私のアプリケーションを何度も再生成すると、たとえsingleinstanceモードであっても、登録されたPhoneStateListenerはonDestroyが呼び出された後でもまだ生存しており、追加を開始します。私は現在、それらを殺すためのエレガントな方法で作業しており、結果をここに掲載します。

アップデート2:リスナーを登録解除するための正しい方法である: instanceOfTelephonyManager.listen(phoneStateListener、PhoneStateListener.LISTEN_NONE)。 は... API

Update3とに従って:としては、より良い言い回し質問にこれを結ぶと約束:https://stackoverflow.com/a/4607435/821423

+0

あなたのタイトルに答えるためだけに、あなたが 'onDestroy()'に置き換える必要があるのは 'super.onDestroy()'です: – Jave

+0

あなたがそれを再現できるのなら、あなたは幸運なプログラマーです。 'onDestroy'はあなたのアクティビティが破壊されたときに呼び出されるコールバックメソッドです。したがって、あなたの活動コードに応じて、ここでリソースを解放するかもしれません。 –

+1

リスナーについて、 'onPause'は常に' onDestroy'の前に呼び出されるので、それを二度呼び出すことは意味がありません。 –

答えて

1

自分の後にクリーンアップし、onPause(で死ぬために準備する活動のための良い方法です) - これは、フォーカスが外れる前に常に呼び出され、ユーザーと対話できません。この後にonDestroy()が呼び出される可能性があります(保証されません)。

あなたのアクティビティにはユーザーのフォーカスがないため、リスナーの結果が表示されないため、リスナーはもう必要ありません。

+0

合意されていますが、どういうわけか、あなたの活動を指し示している参照のリストがないようです...リスナーは1つで、上記のことが分かりました。 –

+0

onPause()はコールされることが保証されている唯一のコールバックです。私はonCreate()に対応するものとしてonDestroyを実装しますが、私のアプリケーションでは、onCreate()のユーザインタフェースをリールアップするので、そこには何もありません。 –

+0

これを受け入れるとマークして、より良い質問。ありがとうございました。 –