2010-08-21 5 views
18

В настоящее время у меня есть файлы для кэширования приложений в подкаталоге cache для приложения. Изображения используются в ListView и хранятся в HashMap от SoftReferences до Bitmaps.Лучшая практика при кешировании файлов в Android

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

Вещи Я обеспокоен:

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

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

Должен ли я включать опцию для выбора местоположения кеша?

Должен ли я попытаться управлять размером кеша (будь то в/cache или/sdcard) или просто забыть об этом?

Благодарим вас за ваше время (его длинный, который я знаю), и, пожалуйста, напишите любое соответствующее событие.

ответ

15

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

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

Кэширование на SD-карту, если оно доступно, является хорошей идеей, если ваш кэш должен занимать много места. Вам нужно будет управлять этим пространством так же осторожно, так как он автоматически не очистит это пространство для вас. Если вы кешируете файлы изображений, обязательно поместите их в каталог, начинающийся с точки, например «/yourAppHere/.cache». Это заставит изображения появляться в галерее, что очень раздражает.

Позволяя пользователю выбрать расположение кеша, кажется мне излишним, но если ваша аудитория очень придирчива, это может быть оценено.

Я не заметил значительного штрафа при кэшировании на SD, но я не знаю, как ваше приложение использует эту информацию.

+0

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

+1

@ chris324 Взгляните на http://developer.android.com/guide/topics/data/data-storage.html#filesExternal под заголовком «Сохранение файлов, которые должны быть доступны» – Eric

+0

@ Эрик спасибо за ссылку, выглядит как внешний каталог с пустым файлом с именем .nomedia, будет игнорироваться медиасканером. Он также выглядит как getExternalCacheDir() - новый в 2.2, который будет полезен. – smith324

2

У каждого есть хорошие идеи. Мне нравится идея использования SoftReference, хотя я не уверен, как часто они очищаются, так как это варьируется от VM до VM. Возможно, вы захотите объединить это с обычным HashMap, чтобы предотвратить очищение всего кеша каждые несколько минут.

EclipseLink имеет несколько различных реализаций кэш-памяти и pretty good documentation on them. Вероятно, вы могли бы воспользоваться несколькими идеями реализации (например, LRU, MRU и т. Д.). например,

  • жесткий кэш
  • мягкий кэш
  • комбинированные жесткий/мягкого кэш

Поскольку вы настройка кэша до суровых будней, я рекомендовал бы настраивая его на различные устройства основанный на жестких спецификациях. Это, как правило, плохой дизайн, но объем аппаратного обеспечения, на котором работает ваше программное обеспечение, соответствует его требованиям, ИМХО. например,

  • Определите объем доступной памяти на SD-карте. Большинство новых смартфонов поставляются с SD-картами с несколькими ГБ, и для большинства пользователей их довольно сложно заполнить обычным образом. Используйте! Вы также можете определить объем свободного места на SD-карте при запуске и увеличить/уменьшить размер кеша при запуске.
  • Определите количество доступной памяти и настройте свои кеши с учетом этого. Если пользователь использует аппаратное приложение, я не думаю, что они будут возражать, что он составляет 200 МБ оперативной памяти и обеспечивает очень быструю работу пользователя, тем более, что они потратили много денег, чтобы иметь телефон с 1 -2 ГБ оперативной памяти.

Удачи вам!

+0

Интересное чтение. Мне нравится идея использования комбинированного жесткого/мягкого справочного кеша. Точная настройка размера кеша, основанного на доступной куче, кажется мне более сложной, хотя esp, поскольку VM даст вам примерно такую ​​же сумму на каждом телефоне. – smith324

+0

Будьте очень осторожны с SoftReferences под Android. Система Android очистит их как можно быстрее, даже если это не поведение, предлагаемое стандартами Java. Вместо Softreferences используется LRU Cache, ограниченный долей доступной памяти. http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html – Janusz

0

Должен ли я включать опцию для выбора местоположения кеша?

IMO: Нет, давайте сделать его более простейшим, насколько это возможно (за исключением вы можете включить предварительную настройку для опытного пользователя)

Должен ли я пытаться управлять размер моего кэша (будь то в/кеш или/sdcard) или просто забыть об этом?

IMO: Это не является обязательным, это двойной меч: ваша больше работы на фоне поможет пользователю больше удобства, но и больше ошибки склонной

Используйте 3-ЛИЭС: ИМО с использованием 3-й библиотеки, как Пикассо лучше, он обрабатывает кеш автоматически по заказу: кеш памяти -> кэш диска -> сеть

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