Стоит ли хранить объект LRUCache в синглтоне приложения?

У меня есть LRUCache, который я использую для кэширования миниатюр и других подобных небольших растровых изображений. В настоящее время я использую его в своей основной деятельности, однако я хотел бы использовать его и в других своих действиях. Это заставляет меня задаться вопросом, стоит ли просто хранить этот объект LRUCache в моем пользовательском синглтоне приложения (который расширяет приложение) и решать проблему доступа к кешу в других действиях. Причина, по которой я обеспокоен, заключается в том, что, насколько я понимаю, если процесс приложения будет убит, что, скорее всего, произойдет, когда приложение будет слишком долго работать в фоновом режиме, объект приложения и, следовательно, кеш получит мусор. собрал. Поправьте меня, если я ошибаюсь, и помогите мне лучше понять эту проблему / предоставьте решение этой проблемы.


person Vishwa Patel    schedule 08.06.2013    source источник


Ответы (2)


Мое обычное эмпирическое правило: для сохраняемых данных используйте дисковый кеш & для быстрых, грязных и легких данных используйте кеш памяти (или кеш lru). Будьте осторожны с хранением растровых изображений в кеше памяти, по крайней мере, для устройств Android ‹ 2.3.3, я полагаю. Пиксельные данные растрового изображения фактически хранятся в собственной памяти, поэтому у разработчиков меньше контроля над поощрением сборки мусора для них. Например, даже установка для вашего растрового изображения значения null или вызов метода recycle() может не полностью убедить сборщик мусора освободить растровое изображение в куче dalvik (куча vm), поскольку это небольшой объект в куче dalvik (куча vm), даже хотя его собственный аналог в собственной памяти является большой причиной OutOfMemoryException.

Извините, что немного отклонился, но подумал, что вы должны знать. Что касается вашего ответа, то ваше предположение верно. Когда андроиду не хватает памяти, он сохраняет последний экземпляр пользовательской активности в своей системной памяти, но может убить ваш процесс, в котором находится ваш объект приложения. Итак, в вашем случае, если вы сохранили 5 растровых объектов в своем объекте приложения, а пользователи ушли на какое-то время, они могут вернуться к действию, запрашивающему растровое изображение из вновь созданного объекта приложения системой, что затем создаст нулевое растровое изображение.

Учитывая эти обстоятельства, решение обычно очевидно. Если вы хотите сохранить данные, вы не можете доверять объектной памяти (в памяти, ОЗУ), по крайней мере, на Android, поэтому дисковая память может быть вашим лучшим вариантом.

Надеюсь это поможет.

person Ryhan    schedule 23.07.2013

Я думаю, что это отличная идея. Вот видео с Google I/O 2012 с некоторой важной информацией: http://www.youtube.com/watch?v=gbQb1PVjfqM

person Karakuri    schedule 08.06.2013
comment
Не могли бы вы объяснить, почему видео актуально? Я понимаю, что это отличный доклад об управлении памятью в целом. Тем не менее, я надеялся точно понять, почему это (наличие LRUCache в классе Application) является хорошей идеей, а если нет, и с какими возможными пограничными случаями я могу столкнуться. - person Vishwa Patel; 08.06.2013