2

ギャラリーからビットマップをロードして(結果の意図をディスパッチすることにより)、画像を表示するプログラムがあります。次に、画像を表示するアクティビティを終了するときに、 を呼び出しますbm.recycle()。しかし、それはビットマップをリサイクルしているようには見えませんか? ここの投稿で説明されている問題のために、これを知っています:同じ画像を2回連続で取得した後のアンドロイドビットマップのメモリ不足エラー

この質問は、具体的には現在のタイトルで述べられているとおりです: onDestroy がビットマップをリサイクルしないのはなぜですか? (気を散らすものとしてではなく、いくつかのコンテキストのリンクを提供するだけです)

ここに私の onDestroy があります:

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindDrawables(findViewById(android.R.id.content).getRootView());
    System.gc();
    myImage.recycle();
    myImage = null;
}
4

2 に答える 2

3

おそらくどこかに、解放するのを忘れた参照があるでしょう。How to find Memory Leak Class/Activity in Androidに関するこの回答も参照してください。メモリがリークしている場所をすばやく見つけるのに役立つと確信しています。

また、自分でメモリを解放する必要があることにも注意してください。コールバックonDestroy()はそれを行いません。


まず、 MAT プラグインをインストールする必要があります。再起動後、[ Dump HPROF file ] をクリックします。

デバイス コントロール

しばらくすると約30秒。終了をクリックできるダイアログが表示されます。このビューを取得するよりも:

結果のダンプ

そこで、最も大きな部分をクリックして、発信参照でフィルタリングします。次に、次のビューを取得します。

ここで、複数のアイテムが保留中 の ContentManager に保存されているアイテムを削除し損ねたことがわかりますHashMap

于 2013-04-26T19:38:29.387 に答える