Стратегия кэширования для Android-приложения

Я думаю о том, как в идеале реализовать уровень кэша в приложении для Android.

В настоящее время у меня есть общие действия, которые отображают данные, поступающие с удаленного сервера. Данные представлены с помощью DTO TemplateInstance. Каждый TemplateInstance имеет карту с компонентами в ней, и каждый из компонентов может иметь дочерние компоненты. Самими компонентами могут быть Text (String), Image (ByteArray) или Time (или что-то другое подкомпонента Component).

В настоящее время мое приложение загружает TemplateInstance с сервера при каждом запуске Activity.

Теперь я хотел бы реализовать уровень кэша в приложении, чтобы

  • время для отображения данных сведено к минимуму,
  • данные обновляются при его изменении на сервере.

Моя стратегия для этого выглядит так:

  • Запущенная активность загружает TemplateInstance из локального хранилища с помощью идентификатора (если существует)
  • UpdateService проверяет в фоновом режиме, если TemplateInstance изменился на сервере (используя поле версии в базе данных)
  • Если версия сервера больше локальной, или нет локального TemplateInstance, тогда извлекайте данные с сервера, обновите локальное хранилище и обновите представление

Я реализовал это уже успешно с db4o. Есть только две проблемы с этим решением:

  • db4o находится под GPL (я не могу его использовать)
  • db4o очень медленно, когда я загружаю TemplateInstances, у которых много изображений (4 секунды для запроса).

Теперь я ищу лучшую замену для db4o. Мои представления об этом до сих пор:

  • SQLite не подходит из-за структуры данных
  • Мне не нужны функциональные возможности базы данных - достаточно получить объекты по ID
  • Сохранение объектов в памяти будет значительно быстрее
  • Состояние памяти должно сохраняться на диске, когда приложение выходит, поэтому объекты могут быть восстановлены при запуске

Как вы думаете, это лучшее решение для этого?

Мои исследования по этому вопросу привели меня к EHCache и JCS, которые я никогда не использовал. Считаете ли вы, что они уместны, а также в отношении ресурсов на телефоне Android? Или у вас есть другие предложения?

Ответ 1

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

Я бы использовал HashMap<id, TemplateInstance>. HashMap сериализуем, и вы можете хранить/загружать его с помощью ObjectOutputStream и ObjectInputStream, соответственно.

Ответ 2

db4o не ограничивается GPL, через dOCL вы можете выбрать другие лицензии с открытым исходным кодом и, если вы не можете пойти open source вообще, он также полностью бесплатно для приложений Android

Ответ 3

Вы можете использовать мою вилку simple-disk-cache Это простой в использовании дисковый кеш, который использует DiskLruCache под капотом.

Я заменил зависимость Apo Commons IO от google guava. И добавьте новые общедоступные методы: put(String key, String value, Object[] array) - значение, которое я использую для установки метки времени для максимального TTL (по истечении этого времени в ms истек срок действия кеша) и: T getArray(String key, Class type)

Вы можете поместить массив из объектов Serializable следующим образом:

cache.put("key", String.valueOf(new Date().getTime() + 60000), Groups[] arrayGroups);

и получить его: Groups[] cacheArray = getCacheArray("key", Groups[].class);

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