0

アプリで大量の画像を表示した後、クラッシュするというユーザー コメントがありました (彼は、メモリ不足エラーが原因であると考えています)。次の関連コードがあります。

    int themeID = mNav[mPos];
    String icon = getThemeData(DbAdapter.KEY_ICON, themeID);
    ImageView viewer = (ImageView)findViewById(R.id.viewer);

    Bitmap bMap = null;
    try {
        bMap = getJPG(icon + ".jpg");
    } catch (IOException e) {
        e.printStackTrace();
    }


    viewer.setImageBitmap(bMap);

ユーザーが画像を切り替えると、それが再実行されます。ここから、ビットマップで recycle() を呼び出す必要があることがわかります。画像を設定した後、bMap で呼び出す必要がありますか? または、次のものを設定する前にビューアーからプルする方法はありますか?

リサイクルのドキュメント (bMap で呼び出す場合) によると、使用する必要はないようです: これは高度な呼び出しであり、通常は呼び出す必要はありません。このビットマップへの参照はもうありません。

4

1 に答える 1

0

明示的に呼び出す必要がrecycle()ある場合は、メモリ リークが発生している可能性があります。それを呼び出すことはほとんど決して解決策ではありません。

アプリでメモリ リークの可能性をチェックしようとしましたか?

これを確認するには、たとえば、デバイスを数回回転させて、ガベージ コレクターの動作を確認します。GC_ のようなものが必要です... 解放された 211K、71% 解放された 300K/1024K、外部 0K/0K、一時停止された 1ms+1ms の LogCat は、回転するたびにほぼ毎回です。この部分の変更に注意してください: 300K/1024K。メモリ リークがなければ、最初の部分が大きくなり、数回の GC の後で小さくなります。メモリ リークが発生すると、OOM エラーが発生するまで拡大します。

メモリリークに関する他の回答を確認してください。

リークがなくandroid:largeHeap="true"、 Honeycombで操作していることが確実な場合は、次のようにアプリでアクセス可能なヒープ サイズを増やすことができます。それを酷使します。

于 2012-05-28T15:49:43.743 に答える