У меня есть LRUCache, который я использую для кэширования миниатюр и других подобных небольших растровых изображений. В настоящее время я использую его в своей основной деятельности, однако я хотел бы использовать его и в других своих действиях. Это заставляет меня задаться вопросом, стоит ли просто хранить этот объект LRUCache в моем пользовательском синглтоне приложения (который расширяет приложение) и решать проблему доступа к кешу в других действиях. Причина, по которой я обеспокоен, заключается в том, что, насколько я понимаю, если процесс приложения будет убит, что, скорее всего, произойдет, когда приложение будет слишком долго работать в фоновом режиме, объект приложения и, следовательно, кеш получит мусор. собрал. Поправьте меня, если я ошибаюсь, и помогите мне лучше понять эту проблему / предоставьте решение этой проблемы.
Стоит ли хранить объект LRUCache в синглтоне приложения?
Ответы (2)
Мое обычное эмпирическое правило: для сохраняемых данных используйте дисковый кеш & для быстрых, грязных и легких данных используйте кеш памяти (или кеш lru). Будьте осторожны с хранением растровых изображений в кеше памяти, по крайней мере, для устройств Android ‹ 2.3.3, я полагаю. Пиксельные данные растрового изображения фактически хранятся в собственной памяти, поэтому у разработчиков меньше контроля над поощрением сборки мусора для них. Например, даже установка для вашего растрового изображения значения null или вызов метода recycle() может не полностью убедить сборщик мусора освободить растровое изображение в куче dalvik (куча vm), поскольку это небольшой объект в куче dalvik (куча vm), даже хотя его собственный аналог в собственной памяти является большой причиной OutOfMemoryException.
Извините, что немного отклонился, но подумал, что вы должны знать. Что касается вашего ответа, то ваше предположение верно. Когда андроиду не хватает памяти, он сохраняет последний экземпляр пользовательской активности в своей системной памяти, но может убить ваш процесс, в котором находится ваш объект приложения. Итак, в вашем случае, если вы сохранили 5 растровых объектов в своем объекте приложения, а пользователи ушли на какое-то время, они могут вернуться к действию, запрашивающему растровое изображение из вновь созданного объекта приложения системой, что затем создаст нулевое растровое изображение.
Учитывая эти обстоятельства, решение обычно очевидно. Если вы хотите сохранить данные, вы не можете доверять объектной памяти (в памяти, ОЗУ), по крайней мере, на Android, поэтому дисковая память может быть вашим лучшим вариантом.
Надеюсь это поможет.
Я думаю, что это отличная идея. Вот видео с Google I/O 2012 с некоторой важной информацией: http://www.youtube.com/watch?v=gbQb1PVjfqM