Утечка памяти растрового изображения? - PullRequest
0 голосов
/ 08 августа 2011

Я создавал систему меню, которая имитирует ViewFlipper, за исключением того, что я лично сбрасывал изображения и текст в RootView сам, пытаясь избежать OOM, связанного с Bitmap.Все шло хорошо до вчерашнего дня, когда я осознал, что после нескольких перезапусков и последующих изменений представления я получу бюджет Виртуальной карты Превышает виртуальную машину ... или что-то подобное.Я запустил трекер распределения и попытался увидеть, что не было выгружено, и обнаружил, что эти вызовы являются источником моей проблемы:

_stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.star_1));
_button.setBackgroundResource(R.drawable.button_1); 
_image.setImageResource(R.drawable.image_1);

Это, конечно, не весь код, но именно на это указывает мне трекердля MANY распределений, подобных этому:

258 72  android.graphics.BitmapFactory$Options  1 android.graphics.drawable.Drawable
481 68  android.graphics.drawable.BitmapDrawable 1 android.graphics.drawable.Drawable
482 52  android.graphics.Paint  1   android.graphics.Bitmap createBitmap    
479 52  android.graphics.Paint 1 android.graphics.drawable.BitmapDrawable$BitmapState
255 36  android.graphics.Bitmap 1   android.graphics.BitmapFactory      
254 36  android.graphics.Canvas 1   android.graphics.Bitmap createBitmap    
250 36  android.graphics.Bitmap 1   android.graphics.Bitmap nativeCreate    
123 36  android.graphics.Bitmap 1   android.graphics.BitmapFactory

Что мне интересно, это нормально?Или у меня где-то есть утечка? По крайней мере 10-20 каждого из них в моих распределениях после теста, и я неизбежно сталкиваюсь с OOM.Не уверен, как позаботиться об этом, кроме как использовать переменную Bitmap, а затем, возможно, Bitmap.recycle (), но это включает в себя проверку того, используется ли представление по-прежнему, и, возможно, перезапуск в неправильное время;следовательно, я не фанат.Я больше просто ищу способ убить все эти выделения каждый раз, когда я закрываю представление. (уже пытался установить для элементов управления значение null onPause () и onDestroy (), надеясь, что они освободят ссылки на растровые изображенияи, таким образом, сможет собирать их, чтобы НЕ ПОЛУЧИТЬ)

[править]

С тех пор я прочитал здесь , что Drawablesобрабатывать по мере необходимости, когда ваша деятельность закончена.Поэтому, поэтому я не должен был вызывать recycle на них, не так ли?Что касается размера одного растрового изображения, это всего лишь одно изображение (480 Вт x 720 ч (x4bpp / 8)) / 1024 = ~ 169 КБ , так что это, кажется, невопрос.

1 Ответ

0 голосов
/ 08 августа 2011

Превышение бюджета виртуальной машины не обязательно означает, что произошла утечка.Я вызвал ту же проблему, пытаясь загрузить одно растровое изображение, которое было просто слишком большим.Кроме того, если вы удалите ссылку, она все равно может не сработать GC, и вам все равно не хватит памяти.Возможно, вам придется как-то вызвать .Recycle, так как я не думаю, что есть способ принудительно запустить GC, когда вы этого хотите, но Recycle освободит нативные ссылки, хранящиеся в растровом изображении, когда вы его запустите, так что вы не будете 'нужно ждать GC.

...