Кэширование растровых изображений - Android - PullRequest
2 голосов
/ 27 января 2012

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

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

Есть ли лучший способ записать файл на диск и загрузить его в память, когда мне это нужно? Есть ли примеры?

Спасибо

Ответы [ 2 ]

8 голосов
/ 27 января 2012

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

Прежде всего: забудьте о SoftReferences на андроиде.Очень плохо для кеширования из-за неправильного поведения (скоро выйдет).В итоге я использовал LruCache ( источник для API <12 </a>) с фиксированным размером байта для кэша.

При загрузке изображений по сети вы хотите сохранить загруженныйизображения (в личной папке данных приложения или на SD-карте).В противном случае пользователь вынужден загружать (ненужные) данные при каждом запуске приложения.Вот процедура:

  1. запрашивается изображение
  2. проверка изображения в кэше памяти (переход к 6., если доступно)
  3. сохраняется локально (переход к 5.если это так)
  4. загрузка из сети и сохранение
  5. загрузка растрового изображения в кеш
  6. загрузка растрового изображения из кеша в представление

Теперь несколько слов о производительности,Если у каждого элемента списка есть другое изображение, и они имеют фиксированный размер (например, 40 x 40 dip), вы потратите кеш-память при загрузке полных изображений (например, 800 x 600 px), и ваше устройство должно будет рассчитать много для масштабирования.1032 * Первое решение - предварительно масштабировать растровое изображение на шаге 5. перед загрузкой изображения в кэш.Вы получите наилучшую производительность, если сохраните масштабированное изображение и загрузите его в следующий раз.

Пример можно найти в моем CoverCache помощнике (обложках компакт-дисков - но может использоваться для любоговид данных изображения).Он имеет дело с сохранением, масштабированием и кэшированием изображений одновременно.

1 голос
/ 27 января 2012

Существует множество реализаций представления списка с отложенной загрузкой изображений с повторным использованием представлений через механизм convertView.Например, посмотрите здесь: Ленивая загрузка изображений в ListView

Существует довольно много решений.

...