0

イベントに基づいてレイアウトに別の背景を設定する必要があります。これにより、OOM 例外が発生していました。これを修正するコードを追加しましたが、これが現在、リサイクルされたビットマップの問題を引き起こしています。

コードは次のとおりです。

       if (change_bg != 0) {
            //Garbage collect the current BG.
            BitmapDrawable bg = ((BitmapDrawable)llayout.getBackground()); 
            llayout.setBackgroundResource(0);
            if (bg != null) {
                bg.getBitmap().recycle();
                bg = null;
            }
            System.gc();

            llayout.setBackgroundResource(change_bg);
            llayout.invalidate();
        }

これは最初は発生しませんが、ランダムに 4 ~ 5 回のイベントが発生した後に発生します。

を呼び出さないとbg.getBitmap().recycle、OOM 例外が発生します。

誰かが間違いを指摘したり、同じビューでレイアウトの背景を設定する正しい方法を提案したりできますか?

ノート:

  1. ;ayout で android:background="@drawable/bg_initial" を削除しましたが、効果はありませんでした。

  2. アプリは、背景画像を持つレイアウトで他のビューを使用していますが、それらのビューでは問題は見られません。

一応、これはメモリの問題ではないようですが、同じビューで別の背景を設定するときの問題です。背景画像を切り替えるために別のものを実装できますが、これはやり過ぎのようです。誰かがシンプルで現実的な解決策を提供してくれたらうれしいです。

編集 :

OnDestroy() にバックグラウンド ビットマップ ガベージ コレクション コードを追加したところ、問題は解決したようです。少なくとも、今は問題を再現することはできません。

しかし、私はこれの説明が何であるか疑問に思っています。レイアウトや画像を静的変数に保持していないため、メモリに保持されていたかどうかはわかりません。何が起こっているのだろうと思います。誰かがこれを説明できますか?

4

1 に答える 1

0

これは、imageViewが画像を参照していて、新しい背景画像を設定する前に、以前の画像 (まだ によって参照されているimageView) をリサイクルしているためである可能性があり、例外がスローされます。

以下を試してください:

  1. 前の背景を取得するBitmapDrawable bg = ((BitmapDrawable)llayout.getBackground());
  2. 新しい背景を設定する
  3. 前の背景をガベージ コレクションします。

OOME を解決するための私の回答を参照してください。ビットマップサイズがVm予算エラーアンドロイドを超えています

于 2013-02-05T14:08:27.733 に答える