Растровое изображение не хватает памяти - PullRequest
9 голосов
/ 13 июля 2011

Я знаю, что существует много дискуссий о растровых изображениях Android из памяти, но мне было интересно, может ли кто-нибудь объяснить это мне ..

В настоящее время в моем приложении есть действие, в котором перечислены миниатюры изображений (низкого качества), и когда я нажимаю на изображение, оно открывает новое действие, чтобы просмотреть изображение в полноэкранном режиме.Во втором уроке у меня есть:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
bm = BitmapFactory.decodeFile(myImagePath, options);

Затем я помещаю это в ImageView, чтобы отобразить его.Это работает и отображает мое изображение в полном качестве.Однако, если я щелкаю назад, а затем нажимаю, чтобы увидеть это изображение снова (и повторяю это 6 раз) .. в 6-й раз, открывая изображение (занятие2), я получаю сообщение об ошибке памяти: Heap size = 6919KB, Allocated = 3125KB, BitmapРазмер = 25848 КБ!

Как велик размер растрового изображения?Я предположил, что это может создавать новые экземпляры все время, поэтому я решил добавить метод во второе занятие для нажатия клавиши «назад» ... и в этом методе я установил свой bitmap = null, а также сделал System.gc ()очистить сборщик мусора, НО это не решило проблему.Я по-прежнему получаю сообщение об ошибке нехватки памяти при шестом щелчке по миниатюре для просмотра изображения в полном разрешении

Кто-нибудь может объяснить, почему?Спасибо

Ответы [ 2 ]

16 голосов
/ 18 мая 2012

Есть отличная информация от Android, которая объясняет все это подробно, и как преодолеть эту проблему здесь .

Каждый пиксель составляет 4 байта. 6 мегапикселей = 24 МБ

Одна фотография может использовать всю память.

Растровые изображения занимают много памяти, особенно для богатых изображений, таких как фотографии. Например, камера на Galaxy Nexus делает фотографии размером до 2592x1936 пикселей (5 мегапикселей). Если используется растровая конфигурация ARGB_8888 (по умолчанию начиная с Android 2.3 и выше), тогда загрузка этого изображения в память занимает около 19 МБ памяти (2592 *1936* 4 байта), что сразу же исчерпывает ограничение для каждого приложения на некоторых устройствах.

Опять я указываю вам на эту замечательную ссылку Я нашел в другом SO Вопросе, в котором есть учебные пособия о том, как правильно решить проблему.

2 голосов
/ 13 июля 2011

inSample size должен быть установлен так, чтобы изображение масштабировалось до размера области отображения (1 = полный размер), если только по какой-то причине вы считаете, что вам нужны все биты изображения, поэтому 2 будет = 1/2масштаб 4 1/4 масштаб и т. д.

Также попробуйте bm.recycle (), когда закончите работу с растровым изображением перед использованием = null

Обновление

Посмотрите на второй ответ , что делает recycle , если вы уже не попробовали это, и это не сработало.Я делал подобные вещи с загрузкой изображений и никогда не исчерпывал память, это не доказательство того, что это будет работать для вас, но насколько я могу судить, это лучшая практика.

...