2016-10-27 2 views
0

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

  1. мое фоновое изображение - 2048x1365 59KB JPEG; его несжатое растровое изображение 11MB
  2. фон на представлении для конкретного устройства будет 480x605, поэтому использование было бы 1.1MB (480x605x4)
  3. моего приложение изначально использует 12MB без фонового изображения
  4. размещения изображения в drawable- nodpi/и установить его в формате XML, чтобы использовать память до 23 МБ; так что точно base + BMP size
  5. Использование BitmapFactory для декодирования изображения (перемещено в raw /), согласно результатам консультаций, в 33 МБ использования памяти. (См коды ниже.)

коды, чтобы установить фон

View view = findViewById(R.id.main_content); 
Rect rect = new Rect(); 
view.getLocalVisibleRect(rect); 
BitmapFactory.Options options = new BitmapFactory.Options(); 
options.outHeight = rect.height(); 
options.outWidth = rect.width(); 
options.inScaled = false; 
Bitmap backgroundBitmap = BitmapFactory.decodeResource(getResources(), backgroundId, options); 
view.setBackgroundDrawable(new BitmapDrawable(getResources(), backgroundBitmap)); 

Что идет не так? Что еще я могу сделать, чтобы уменьшить использование памяти?

+0

Рассчитайте правильную 'inSampleSize'. Прямо сейчас ваш код «BitmapFactory» загружается во всем изображении с полным разрешением. Как вы заметили, вам это не нужно. 'inSampleSize' в' BitmapFactory.Options' сообщает 'BitmapFactory', чтобы дать вам масштабированную растровую карту, которая ближе к желаемому размеру. – CommonsWare

+0

@CommonsВсе это работает. Теперь динамическая загрузка изображения потребляет только 1,1 Мбайт дополнительной памяти, как и ожидалось! Если вы опубликуете его в качестве ответа, я его проголосую. –

ответ

1

Уловка для получения BitmapFactory, чтобы дать вам изображение с низкой памятью, чтобы заполнить inSampleSize на BitmapFactory.Options. Это сообщает BitmapFactory о снижении размера изображения при загрузке, что дает вам изображение с низким разрешением, но оно лучше настраивается на все, что вы планируете использовать. Вам нужно будет вычислить желаемый inSampleSize, который вы хотите, на основе разрешения ImageView (или любого другого), для которого вы используете изображение.

This sample app демонстрирует загрузку некоторых изображений из assets/ с различными значениями inSampleSize.

0

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

Смежные вопросы