Я использовал следующий код в onDestroy
для повторного использования большого растрового изображения, чтобы быстро восстановить память. Если я этого не сделаю, приложение вылетит с ошибкой OutOfMemory после нескольких поворотов экрана. Андроид плохо справляется с памятью.
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. Если я этого не сделаю, у приложения закончится память. Что я должен делать? Как правильно освободить память, что реально работает?