1

メモリをすばやく復元するために、次のコードを使用しonDestroyて大きなビットマップをリサイクルしていました。そうしないと、画面を数回回転させた後、アプリケーションが OutOfMemory エラーでクラッシュします。Android はメモリの処理が苦手です。

ImageView imgBG = (ImageView)findViewById(R.id.mainBG);
if (imgBG != null)
{
    ((BitmapDrawable)imgBG.getDrawable()).getBitmap().recycle();
    imgBG.setImageDrawable(null);
}
System.gc();

残念ながら、ICS では状況が変わりました。彼らはリソースのキャッシュを開始し、ビットマップをリサイクルすると、実際にはキャッシュ内のビットマップがリサイクルされます。Android はそれを理解するほどスマートではなく、将来的にリサイクルされたビットマップを使用しようとします。その結果、次のようになります。

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@40f44390
at android.graphics.Canvas.throwIfRecycled(Canvas.java:1047)
at android.graphics.Canvas.drawBitmap(Canvas.java:1151)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:400)
at android.widget.ImageView.onDraw(ImageView.java:973)
at android.view.View.draw(View.java:11014)
at android.view.ViewGroup.drawChild(ViewGroup.java:3186)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788)
at android.view.ViewGroup.drawChild(ViewGroup.java:3184)
[...]

ここで問題です。リサイクルすると、ICS でクラッシュします。そうしないと、アプリがメモリ不足になります。私は何をすべきか?実際に機能するメモリを解放する正しい方法は何ですか?

4

1 に答える 1

-3

これを試して:

ImageView imgBG = (ImageView)findViewById(R.id.mainBG);
if (imgBG != null)
{
    BitmapDrawable drawable = ((BitmapDrawable)imgBG.getDrawable()).getBitmap();
    imgBG.setImageDrawable(null);
    drawable.recycle();
}
System.gc();
于 2012-07-21T07:50:15.973 に答える