7

私はいくつかの大きなドローアブルを使用していますが、メモリリークを管理する方法がわかりません。アプリケーションのヒープサイズを追跡しましたが、(割り当てられたメモリとして)成長が止まりません。

特に「バイト配列(byte [])」タイプは大きくなり、決して減少しません。(EclipseのDDMSヒープビューで)

私のアプリケーションは、フラグメントを使用する1つのアクティビティで構成されています。それらの断片は、いくつかの大きな画像を表示しています。ドローアブルコールバックをnullに設定し、ドローアブルをnullに設定し、フラグメントをポップバックするときに揮発性キャッシュをクリアしようとしましたが(アプリがディスクIOを過剰に実行するのを防ぎます)、ヒープが減少することはありません。

実際、呼び出すたびに:Drawable.createFromResourceStream(context.getResources()、value、new FileInputStream(f)、f.getName()、opts); ヒープが大きくなります。どうすればメモリを解放できますか?

ありがとう !

4

2 に答える 2

6

メモリリークは、Javaがコードによって参照されているオブジェクトをメモリ内で検出したときに発生します。これにより、ガベージコレクタがこのメモリを解放できなくなります。Androidの一般的な原因は、アプリケーションコンテキストではなくアクティビティコンテキストを参照していることです。コンテキストがアプリケーションを参照していることを確認してください(つまり、使用するのgetApplicationContextではなく使用してください。メモリリークの説明についてはthisこのビデオを確認し、この質問も確認してください。

于 2012-09-15T14:49:32.153 に答える
3

質問は答えられたようですが、Romain Guyによる投稿は、より多くの情報を取得するのに関連しているようです:メモリリークの回避

どうやら、(たとえば)setBackgroundDrawable *を使用してドローアブルを背景画像としてテキストビューに設定した場合(つまり、ドローアブルをビューにアタッチした場合)、方向を変更した場合(アクティビティを破棄してUIを再描画した場合)、ドローアブルには引き続き古いアクティビティへのアクセス(古いアクティビティの破棄後)、したがってメモリリークが発生します。

*(補足として-setBackgroundDrawableはAPIレベル16以降非推奨になりました)

于 2013-07-10T23:17:17.473 に答える