У меня в данный момент есть файлы кэширования изображений моего приложения в подкаталоге кеша для приложения. Изображения используются в
ListView
и хранятся в HashMap
из SoftReferences
- растровых изображений
.
Итак, мой вопрос заключается в следующем, Каков наилучший способ кэшировать эти файлы изображений, не увеличивая пространство, которое мое приложение использует, и остается отзывчивым с точки зрения пользователя.
Вещи, которые меня беспокоят:
Я знаю, что пользователь может очистить кеш и что это делается автоматически, когда на внутренней памяти недостаточно места, но я чувствую, что большинство пользователей увидят приложение объемом несколько МБ и удалят его. Кроме того, если пространство постоянно мало, мое приложение будет просто загружать изображения, делая его медленнее.
На большинстве устройств предварительно установлена SD-карта, но что мне делать, если она не вставлена? SD-карта также может работать медленнее, чем внутренняя память, что влияет на производительность моего приложения.
Стоит ли включать опцию выбора местоположения кеша?
Стоит ли пытаться управлять размером кеша (будь то в / cache или / sdcard) или просто забыть об этом?
Спасибо Вы потратили свое время (я знаю, это очень долго) и, пожалуйста, опубликуйте любой соответствующий опыт.
Я не могу предложить вам исчерпывающий набор рекомендаций, но могу предложить то, что я узнал на данный момент:
Управление кешем — хорошая идея. Кэш моего приложения таков, что я знаю, что мне никогда не понадобится больше, чем определенное количество кэшированных файлов, поэтому всякий раз, когда я вставляю новый файл в кеш, я удаляю самые старые файлы, пока не достигну предела, который я установил. Вы можете сделать что-то подобное в зависимости от размера или просто возраста.
Кэширование на SD-карту, если оно доступно, является хорошей идеей, если ваш кеш должен занимать много места. Вам нужно будет так же тщательно управлять этим пространством, поскольку оно не будет автоматически очищать это пространство для вас. Если вы кэшируете файлы изображений, обязательно поместите их в каталог, начинающийся с точки, например «/yourAppHere/.cache». Это предотвратит отображение изображений в галерее, что очень раздражает.
Позволить пользователю выбирать расположение тайника кажется мне излишеством, но если ваша аудитория очень фанатична, это может быть оценено по достоинству.
Я не заметил особых проблем при кэшировании на SD-карту, но я не знаю, как ваше приложение использует эту информацию.
У всех есть хорошие идеи. Мне нравится идея использования SoftReference
, хотя я не уверен, как часто они очищаются, поскольку это сильно различается от ВМ к ВМ. Возможно, вы захотите объединить это с обычным HashMap
, чтобы предотвратить очистку всего кеша каждые несколько минут.
EclipseLink имеет несколько различных реализаций кэша и довольно хорошую документацию по ним . Вероятно, вы могли бы воспользоваться некоторыми идеями из реализации (например, LRU, MRU и т. Д.). например,
Поскольку вы настраиваете кеш до мельчайших деталей, я бы рекомендовал настроить его для различных устройств на основе жестких спецификаций . Обычно это плохой дизайн, но объем оборудования, на котором работает ваше программное обеспечение, требует этого, ИМХО. например,
Удачи!