Раздел: Эффективная работа с изображениями

Эффективная работа с изображениями

В этом разделе мы обсудим распространенные приемы обработки и загрузки растровых объектов типа Bitmap, которые позволяют сохранить отзывчивость пользовательского интерфейса и уменьшить расход памяти. Если вы не будете внимательно к этому относиться, растровые изображения очень быстро израсходуют всю память, что приведет к краху приложения из-за исключения java.lang.OutofMemoryError: bitmap size exceeds VM budget.

Материалы урока

Вот несколько причин, почему загрузка изображений в вашем приложении не такая тривиальная задача, как кажется:

  • Обычно у мобильных устройств довольно мало системных ресурсов. Устройства на Android могут иметь вплоть до 16Мг памяти, доступной для приложений. В разделе 3.7 документа Android совместимости сказано, что виртуальная машина дает необходимый минимальный объем памяти приложению для различных размеров и плотности экранов. Приложения должны быть оптимизированы, чтобы исполняться в рамках данного минимума. Однако, не забывайте, что многие устройства могут быть сконфигурированы для работы с более высокими ограничениями.
  • Растровые изображения занимают очень много памяти, особенно фотографии. Например камера Galaxy Nexus делает фотографии размером 2592x1936px (5 мегапикселей). Если используется профиль ARGB_8888 (по умолчанию, начиная с Android 2.3), то в памяти такое изображение займет около 19Мб (2592*1936*4 байт), сразу исчерпав лимит памяти для приложения на некоторых устройствах.
  • Зачастую требуется загрузить сразу несколько изображений за раз. Компоненты, вроде ListView, GridView и ViewPager обычно отображают несколько изображений на экране, а еще несколько изображений держат подготовленными на случай, если пользователь будет листать экран.

Уроки

Эффективная загрузка больших растровых изображений
В уроке рассказывается как уложиться в лимит памяти при декодировании больших изображений.
Обработка изображений в отдельном потоке
Обработка изображений (изменение размеров, загрузка по сети, и.т.д) не должна выполняться в главном потоке. В уроке мы расскажем как запустить обработку в отдельном потоке, используя класс AsyncTask и как решать проблемы параллельной работы.
Кэширование изображений
Узнайте как использовать кэш-память и дисковый кэш для сохранения плавности и отзывчивости пользовательского интерфейса, при загрузке нескольких изображений.
Управление памятью при работе с изображениями
Как управлять памятью при работе с изображениями и повысить производительность приложения рассказано в данном уроке.
Показываем изображения в интерфейсе
Последний урок раздела объединяет в себе все предыдущие. Мы покажем, как загрузить множество изображений в компоненты просмотра, вроде ViewPager и GridView, используя кэш и отдельные потоки для обработки.