Хороший способ кэширования данных в течение жизненного цикла приложения Android? - PullRequest
16 голосов
/ 20 апреля 2010

Говоря коротко, я создал приложение с 3 видами деятельности, где A - список категорий, B - список элементов, C - один элемент. Данные, отображаемые в B и C, анализируются из оперативного XML. Но, если я пройду через A -> B1 -> C, затем вернусь к A и затем вернусь к B1, я бы хотел где-то кэшировать его данные, чтобы мне не пришлось снова запрашивать XML.

Я новичок в программировании на Android и Java, много гуглюл и до сих пор не могу найти (или просто не знаю, где искать) способ сделать то, что хочу.

Будет ли хорошей идеей сохранить все полученные данные в основном задании A (HashMaps? ContentProviders?), А затем передать их в B и C (если они получают тот же запрос, что был раньше)?

Ответы [ 3 ]

13 голосов
/ 14 июня 2010

Простой и быстрый способ кеширования информации или отслеживания состояния приложения - это расширение Приложения , как описано в этого сообщения в блоге .

Этот пост блога забывает добавить, что вы должны установить класс CustomApplication в манифесте, например:

<application [...] android:name="CustomApplication">

В моих проектах я придерживаюсь стиля синглтона через getInstance.

Дополнительные ресурсы: этот ответ , Глобальные переменные в приложениях для Android и это сообщение в блоге .

2 голосов
/ 14 июня 2010

Если вы хотите построить какой-то кэш-память, рассмотрите возможность использования Map с SoftReferences. SoftReferences - это своего рода ссылки, которые, как правило, хранят ваши данные некоторое время, но не мешают их сборке.

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

Извлеките MapMaker из Коллекций Google , что позволяет удобно создавать двухуровневый кэш. Подумайте об этом:

/** 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

0 голосов
/ 20 апреля 2010

Вы можете использовать хранилище данных, как описано в Справочнике по Android здесь http://developer.android.com/guide/topics/data/data-storage.html

...