Я думаю о том, как в идеале реализовать уровень кэша в приложении для 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? Или у вас есть другие предложения?