Вопрос

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

Сохраните их на SD-карте в общей папке

  • Использует пространство, которое не будет освобождено при удалении
  • Пользователь может видеть фотографии в Галерее
  • Нужна папка в корне SD-карты (вы действительно можете видеть ее во время просмотра вашего телефона)

Сохраните их на SD-карте в закрытой папке

  • Использует пространство, которое не будет освобождено при удалении
  • Тайно использует место на SD-карте

Сохраните их внутри приложения

  • Слишком сильно увеличивает размер приложения

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

Это было полезно?

Решение

Ваше лучшее решение - использовать:

context.getCacheDir()

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

Обратите внимание, однако, что в документах говорится:

вы не должны полагаться на систему удаление этих файлов за вас;у вас всегда должен быть разумный максимум, например 1 МБ, для объема пространства, которое вы занимаете файлами кэша, и удаляйте эти файлы при превышении этого пространства

Если вам нужно много места и вы предпочитаете использовать SD-карту, вы можете позвонить

getExternalCacheDir()

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

Environment.getExternalStorageState()

прежде чем пытаться написать в него.

Другие советы

Вы можете скрыть изображения из Медиасканнера, если вы поместите это в скрытый каталог (т. е. с префиксом точки), например /sdcard/.donotscan/.

Обновить:Как романгуй упоминает в твиттере это также работает, если вы помещаете файл с именем .nomedia в реж.

Я думаю, что лучший способ - это использовать базу данных.

  1. Это не приводит к перегрузке приложения и памяти.
  2. Связанная база данных удаляется после удаления приложения.
  3. Никто не может получить доступ к этим файлам, кроме вашего приложения.

Обновить:Но;Если вы хотите кэшировать только данные, в webkit определен менеджер кэша. Менеджер кэша

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

static boolean   cacheDisabled()
static boolean   endCacheTransaction()
static CacheManager.CacheResult  getCacheFile(String url, Map<String, String> headers)
static File  getCacheFileBaseDir()
static void  saveCacheFile(String url, CacheManager.CacheResult cacheRet)
static boolean   startCacheTransaction()

и вы можете найти применение по адресу Код Google Gears

Я надеюсь, что это поможет.

Если вы не хотите использовать CacheManager, тогда используйте базу данных или локальный файл (не SD) (локальные файлы удаляются при полной деинсталляции) и зарегистрируйтесь, чтобы получать широковещательные действия 'ACTION_DEVICE_STORAGE_LOW' и 'ACTION_DEVICE_STORAGE_OK'.Тогда вы будете знать, когда ваше приложение занимает слишком много места в зависимости от устройства и когда вам нужно начать удалять изображения.Размер вашего приложения по-прежнему будет увеличиваться, но вы сможете управлять ростом и сокращением.

Просто совет - если вы сохраните их на SD-карте, они будут отсканированы MediaScanner и появятся в галерее пользователей (Фотографии), что вам, вероятно, не нужно.Поэтому вы, вероятно, захотите сохранить их на телефоне или каким-то образом попросить MediaScanner не сканировать их (что, по-видимому, невозможно после быстрого поиска в Google).)
Вероятно, лучше всего сохранить несколько избранных файлов в личном каталоге вашего приложения, которые будут удалены при удалении вашего приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top