0

私は今、メモリリークと戦っています。

好奇心から、View クラスまたは Adapter クラスのメンバーである mContext が null クリアされるのはいつですか?

そんなことをしている部分は見当たりませんでした…

編集:

GCについては知っていますが、たとえば、

ArrayAdapter には mContext があり、Activity に ArrayAdapter への参照がある場合、これは循環参照ですか?

4

3 に答える 3

2

null変数がいつ解放されるかを確認することは、制御できません。ただし、OOMEの問題は回避できます。

Dmitryが言ったように、を使用している場合は、使用後すぐにそのメソッドをBitmaps呼び出します。recycle()このようにして、保持しているリソースをクリアし、アプリケーションを実行するためのスペースを作ることができます。

GCを呼び出しても、GCがリソースを解放するかどうかわからないため、GCを呼び出しても意味がありません。

また、コードにメモリリークの問題がないかどうかを確認してください。これもOOMEにつながる可能性があるため。EclipseにMAT(プラグイン)を使用すると、メモリリークの問題を確認できます。

これで問題が解決しない場合でも、お問い合わせください。別の解決策を見つけようとします。

ありがとうございました :)

于 2012-09-03T05:36:58.473 に答える
2

コンテキストは通常​​、Android によって管理される所有アクティビティです。アクティビティがアクティブになるまで、アクティブで有効であることが保証されます。何かトリッキーな、またはかなり低レベルのことをしているのでない限りmContext、ビューやアダプターについて協調すべきではありません。

考慮すべきことはContext mContext、アクティビティ (サービス、スレッド、アプリケーション クラスなど) よりも長く存続する可能性があるクラス (または同様のフィールドなど) へのアクティビティへの参照を格納することです。これにより、システムがアクティビティを適切に GC することが妨げられ、メモリ リークや微妙なバグが発生します。

于 2012-09-03T05:52:15.337 に答える
1

ガベージコレクタが取得するまでクリアされません。言い換えると、変数への参照がない場合はすべてGCによって収集されるため、変数をクリアすることについて心配する必要はありません(すぐには収集されませんが、そうなります)。

しかし、Androidには問題を引き起こすクラスが1つあります- Bitmap。アプリにメモリリークがある場合は、まず、ビットマップの使用状況を確認します。終了したら必ず電話してrecycleください。

于 2012-09-03T05:26:13.437 に答える