0

アセットから画像を取得し、imageView に割り当てています。すべて正常に動作しますが、同じページを何度もロードするとヒープ メモリ サイズが増え続けます。以下は、アセット フォルダーから画像を取得するために使用しているコードです。

private Bitmap getBitmapFromAsset(String strName) throws IOException
{
    AssetManager assetManager = getAssets();

    InputStream istr = assetManager.open(strName);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);

    return bitmap;
}

    //Code to assign bitmap to imageview
    ImageView itemImage = (ImageView) findViewById(R.id.itemImage);
    try {
        Bitmap bm = getBitmapFromAsset("full/" + Uri.parse(menuItem.getFullImage()).getLastPathSegment());
        itemImage.setImageBitmap(bm);
    } catch (IOException e) {
        e.printStackTrace();
    }

これが私がやっていることのすべてです。ビットマップをリサイクルする必要がある場所はありますか?

4

5 に答える 5

2

onDestroy に追加

   @Override
        public void onDestroy()
        {

            super.onDestroy();
            if(bm != null)
            {
                bm.recycle();

            }
}

さらに、メモリ ダンプを取得し、 MATを使用してダンプを分析します。ヘルプが必要な場合は、このビデオチュートリアルを参照してください。

于 2012-09-22T16:06:22.003 に答える
0

Bitmapオブジェクトを使用したら、recycle()ネイティブ リソースを解放するメソッドを呼び出す必要があります。

ビットマップ#リサイクル()

このビットマップに関連付けられたネイティブ オブジェクトを解放し、ピクセル データへの参照をクリアします。これにより、ピクセル データが同期的に解放されることはありません。他に参照がない場合は、ガベージコレクションを許可するだけです。ビットマップは「dead」とマークされます。つまり、getPixels() または setPixels() が呼び出されると例外がスローされ、何も描画されません。この操作は元に戻すことができないため、ビットマップをこれ以上使用しないことが確実な場合にのみ呼び出す必要があります。これは高度な呼び出しであり、通常、このビットマップへの参照がなくなると通常の GC プロセスによってこのメモリが解放されるため、呼び出す必要はありません。

于 2012-09-22T16:16:10.127 に答える
0

実際には、すべてのアクティビティによって拡張される親アクティビティを使用しており、そのアクティビティは LocationListener に登録されているため、LocationListener はアクティビティの破棄を妨げています。

于 2012-11-13T05:48:32.757 に答える
0

これを確認したら

ビットマップの使用が完了したら、次のステートメント bm = null; を使用します。System.gc(); と書きます。ondestroy() で (必要に応じて onPause() で)、それが機能するかどうかを確認します

于 2012-09-22T15:37:20.590 に答える