Я пытаюсь создать систему кэширования изображений для Android, но потребление памяти просто растет и растет. Я просмотрел Android website для некоторых идей, но проблема просто не хочет исчезать.Утечка памяти Bitmap памяти
Ниже приведен мой код получения изображения с SD-карты, установка его и последующее уничтожение. Что я делаю неправильно?
WeakReference<Bitmap> newImageRef;
public void setImageFromFile(File source){
if(source.exists()){
Bitmap newImage = BitmapFactory.decodeFile(source.getAbsolutePath());
newImageRef = new WeakReference<Bitmap>(newImage);
if(newImage != null){
this.setImageBitmap(newImage);
}
}
}
@Override
protected void onDetachedFromWindow() {
Bitmap newImage = newImageRef.get();
if (newImage != null) {
newImage.recycle();
newImage = null;
}
Drawable drawable = getDrawable();
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap != null){
bitmap.recycle();
}
}
this.setImageResource(0);
newImage = null;
newImageRef = null;
System.gc();
super.onDetachedFromWindow();
}
Я удивлен, что он не падает. Вы по существу перерабатываете одно и то же растровое изображение дважды (один раз, как newImageRef, затем как вытягиваемый). Вы уверены, что вызывается onDetachedFromWindow? Вы проследили это? – msh
@msh Ну, у меня есть 'if (bitmap! = Null) {' во втором цикле, поэтому он не падает. И да, этот метод называется. Я попытался получить кучу кучи, и он говорит, что Bitmap и BitmapDrawable занимают больше всего памяти. –
Bitmap.recycle() не делает его нулевым, он освобождает внутреннее растровое хранилище. Если вы освободите его дважды, вы можете потерпеть крах. – msh