Хороший способ кэшировать данные во время жизненного цикла приложения Android?
сохраняя мой вопрос коротким, я создал приложение с тремя действиями, где A - список категорий, B - список элементов, C - отдельный элемент. Данные, отображаемые в B и C, анализируются из онлайн-XML. Но, если я пройду через A → B1 → C, а затем вернусь к A, а затем вернусь к B1, я хотел бы, чтобы его данные были кэшированы где-то, поэтому мне больше не нужно будет запрашивать XML.
Я новичок в программировании на Android и Java, я много искал и не могу найти (или просто не знаю, где искать) способ сделать то, что я хочу.
Будет ли сохраняться все полученные данные в основном действии A (HashMaps? ContentProviders?), а затем перейти к B и C (если они получат тот же запрос, который был раньше), хорошая идея?
Ответы
Ответ 1
Простой и быстрый способ кэширования информации или отслеживания состояния приложения заключается в расширении Приложения, как описано в этом сообщении в блоге.
Это сообщение в блоге забывает добавить, что вы должны установить свой класс CustomApplication в манифесте, например:
<application [...] android:name="CustomApplication">
В моих проектах я придерживаюсь стиля singleton с помощью getInstance.
Дополнительные ресурсы: этот ответ, Глобальные переменные в приложениях для Android и это сообщение в блоге.
Ответ 2
Если вы хотите создать какой-то кеш в памяти, подумайте об использовании карты с SoftReferences. SoftReferences - это несколько ссылок, которые, как правило, сохраняют ваши данные на некоторое время, но не мешают ему собирать мусор.
Память на сотовом телефоне мало, поэтому хранить все в памяти может быть непрактично. В этом случае вы можете сохранить свои кеши на вторичном хранилище устройства.
Ознакомьтесь с MapMaker от Google Collections, который позволяет вам удобно создавать двухуровневый кеш. Подумайте об этом:
/** Function that attempts to load data from a slower medium */
Function<String, String> loadFunction = new Function<String, String>() {
@Override
public String apply(String key) {
// maybe check out from a slower cache, say hard disk
// if not available, retrieve from the internet
return result;
}
};
/** Thread-safe memory cache. If multiple threads are querying
* data for one SAME key, only one of them will do further work.
* The other threads will wait. */
Map<String, String> memCache = new MapMaker()
.concurrentLevel(4)
.softValues()
.makeComputingMap(loadFunction);
О кэше на вторичном хранилище устройства, проверьте Context.getCacheDir(). Если вы неаккуратно, как я, просто оставите все там и надейтесь, что система очистит вас, когда потребуется больше места: P
Ответ 3
Вы можете использовать хранилище данных, как описано в Android Reference здесь http://developer.android.com/guide/topics/data/data-storage.html