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