Как реализовать кэш-память в памяти в Android? - PullRequest
12 голосов
/ 20 января 2012

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

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

В запросе об ошибке для мягкого эталонного поведения говорится, что это предполагаемое поведение, и что вы должны использовать LRU-Cache для кэширования такого рода вещей.

Знай на мой вопрос. Кэш LRU займет столько памяти, сколько я позволю ему. Но если приложению нужно много памяти, оно не освободит память. Как определить, сколько памяти я могу использовать для кэша, и есть ли способ уменьшить размер кэша, если ситуация с памятью телефона становится напряженной?

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

1 Ответ

3 голосов
/ 20 января 2012

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

Если вы освобождаете свой кэш каждый раз, когда ваш процесс основан на фоновом режиме, переключение обратно на ваше приложение больше не будет быстрым, потому что он будет видеть пропуски кэша. Это побеждает оптимизацию Android-поддержки-фоновых процессов!

Вы должны просто использовать LruCache , который также включен в Пакет поддержки Android для выпусков до Android 3.0 (Honeycomb).

...