Самое быстрое место для получения изображений в Android

Я разрабатываю небольшое приложение для социальных сетей, которое использует что-то вроде изображений профиля. Изображения хранятся на сервере, и у меня настроены сценарии, которые будут отправлять изображение для каждого пользователя в приложение, которое затем отображает его в представлении изображения для каждого пользователя, а затем сохраняет изображение во внешнем хранилище. То, как я это реализовал сейчас, заключается в том, что каждый раз, когда приложению требуется изображение после его загрузки с сервера, приложение получает изображение из внешнего хранилища, если пользователь не загрузил новое изображение (я думал, что это будет быстрее, чем повторная загрузка с сервера каждый раз). Тем не менее, кажется, что получение файла из внешнего хранилища занимает больше времени, чем получение его с моего сервера (и сервер довольно медленный, работает через Wi-Fi с 3 этажей ... бюджетные ограничения :)).

Мой вопрос в том, какой самый быстрый способ получить эти изображения, если пользователь не загрузил новый. Должен ли я просто загружать его с сервера каждый раз (я предполагаю, что нет) или есть лучшее место в файловой системе для хранения изображений, которое ускоряет поиск?


person Eliezer    schedule 05.04.2011    source источник
comment
Как вы храните изображения?   -  person Matthew Willis    schedule 06.04.2011
comment
Я получаю InputStream, используя URLHttpConnection для изображения на сервере, затем я создаю новый файл на Android, например, этот новый файл (callingComponent.getExternalFilesDir (DIRECTORY PICTURES), имя пользователя + .jpg); затем я получаю байт [] из InputStream и записать его в файл с помощью OutputStream   -  person Eliezer    schedule 06.04.2011


Ответы (1)


Загрузка изображений с SD-карты должна быть очень быстрой. Некоторые стратегии:

  1. Сделайте это только один раз. Загружайте изображения в память асинхронно при запуске вашего действия или приложения. Вы не хотите нажимать на SD-карту каждый раз, когда ваш вид обновляется.
  2. Сделайте их маленькими. Если у вас возникли проблемы с производительностью при отображении миниатюр в списке, попробуйте сохранить миниатюры как изображения меньшего размера, используя inSampleSize, чтобы уменьшить нагрузку на декодер.
  3. Использовать внутреннюю память. Я думаю, что внутренняя память работает быстрее, но ее, как правило, не хватает. Конечно, вы можете хранить некоторое количество эскизов в своем каталоге кеша, чтобы ускорить шаг 1.
  4. Отзывчивость важнее производительности. Золотое правило заключается в том, чтобы помнить, что абсолютная производительность не всегда коррелирует с отзывчивостью. Даже если изображения загружаются долго, разумный выбор времени загрузки изображений может оказать большое влияние на восприятие пользователем скорости.
person Matthew Willis    schedule 06.04.2011
comment
Итак, я понял, что проблема заключалась в том, что когда я пытался загрузить изображения с SD-карты, BitmapFactory.decodeStream возвращал значение null, потому что, по-видимому, возникла ошибка при использовании InputStream с BitmapFactory.decodeStream. Я исправил это, и теперь в среднем требуется 14 секунд, чтобы загрузить 10 изображений с сервера, сохранить и отобразить их, а когда они считываются с SD-карты, это занимает 8 секунд каждый раз, независимо от того, что я установил в SampleSize или если я сжимаю файл с качеством 10. Это лучшее, что я мог ожидать от SD-карты? Я просто пытаюсь получить максимально эффективное время, которое я могу на данный момент - person Eliezer; 06.04.2011
comment
Вы пытались кэшировать эскизы в каталоге кеша? Сколько изображений загружается за 8 секунд? - person Matthew Willis; 06.04.2011
comment
Ах, я знал, что забыл кое-что попробовать :) Я попробую это завтра, потому что я уже закрыл Eclipse. Загрузка 10 изображений с SD-карты заняла 8 секунд. - person Eliezer; 06.04.2011
comment
Кстати, вы должны использовать inSampleSize перед сохранением изображений на SD-карту, чтобы сохраняемые изображения (миниатюры) были меньше. - person Matthew Willis; 06.04.2011
comment
Я установил для inSampleSize значения 2 и 4 (два разных теста, не одновременно) и сделал BitmapFactory.decodeStream, отправив ему параметр BitmapFactory.Options, который я сделал. Затем я сохранил это растровое изображение на SD-карту. - person Eliezer; 06.04.2011
comment
Я использовал кеш для стольких изображений, сколько мог поместить, когда увеличил количество изображений до 50 (что, вероятно, является средним значением того, сколько изображений должно быть, когда я запускаю приложение) и разница между кешем и SD-карта была не так уж заметна. Я думаю, лучший способ сделать это - стратегически и асинхронно выполнять все эти операции, чтобы вы получили ответ - person Eliezer; 08.04.2011