Кэширование изображений Android - сложный и мягкий вопрос HashMaps - PullRequest
0 голосов
/ 16 августа 2011

То, что я сейчас пытаюсь сделать в своем приложении, - это изменить класс ImageDownloader , который Google выпустил в прошлом году в одном из своих учебных пособий, которые асинхронно загружают и кэшируют изображения для ImageViews без утечки контекста.

Другими словами, поскольку я использую объект единого объекта глобального кэша, который предоставляет ссылки на мои растровые хэш-карты, мне просто нужно знать: так как я должен кэшировать изображения отдельно в зависимости от определенных аспектов моего приложения (требования клиента), у меня должны быть пары жестких и мягких HashMap для каждого из этих типов битовых карт, или было бы более эффективно иметь только одну мягкую HashMap, в которую другие жесткие кэши перемещают свои файлы, когда они нажимаются для пробела?

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Попробуйте использовать что-то вроде:

ConcurrentHashMap<String, SoftReference<Bitmap>> image_cache =
newConcurrentHashMap<String, SoftReference<Bitmap>>( 1 );

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

Вы можете создать резервную копию этого кэша с файловым кешем либо на SD-карте с корневым путем, используя:

Environment.getExternalStorageDirectory();

или используя пространство кэша, предоставленное Android, используя путь:

context.getCacheDir(); 

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

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

0 голосов
/ 16 августа 2011

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

...