Использование LruCache: привязан ли кэш к экземпляру LruCache? - PullRequest
0 голосов
/ 08 апреля 2019

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

Пример:

class CacheInterface {

    private val lruCache: LruCache<String, Bitmap>

    init {
        val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt()
        // Use 1/8th of the available memory for this memory cache.
        val cacheSize = maxMemory / 8
        lruCache = object : LruCache<String, Bitmap>(cacheSize) {
            override fun sizeOf(key: String, value: Bitmap): Int {
                return value.byteCount / 1024
            }
        }
    }

    fun getBitmap(key: String): Bitmap? {
        return lruCache.get(key)
    }

    fun storeBitmap(key: String, bitmap: Bitmap) {
        lruCache.put(key, bitmap)
        Utils.log(lruCache.get(key))
    }

}
val bitmap = getBitmal()
val instance1 = CacheInterface()
instance1.storeBitmap("key1", bitmap)
log(instance1.getBitmap("key1")) //android.graphics.Bitmap@6854e91
log(CacheInterface().getBitmap("key1")) //null

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

Ответы [ 3 ]

2 голосов
/ 08 апреля 2019

Объект LruCache просто хранит ссылки на объекты в памяти. Как только вы потеряете ссылку на LruCache, объект LruCache и все объекты в этом кэше будут собраны сборщиком мусора. На диске ничего не хранится.

0 голосов
/ 09 апреля 2019

Да, это так.Я просто поделюсь здесь тем, что меня смутило на тот случай, если кто-то тоже.

Из-за этого руководства (Кэширование растровых изображений) , которое рекомендуется с помощью LruCache, меня оставили подСоздается впечатление, что LruCache был интерфейсом для доступа к кешу приложения, но, как упомянул @CommonsWare, в нем нет ввода-вывода - это всего лишь служебный класс для хранения памяти с использованием политики LRU.Для доступа к кешу вашего приложения вам нужно использовать Context.getCacheDir(), хорошее объяснение здесь .В моем случае я использовал единственный LruCache, поскольку у меня уже есть служба, работающая большую часть времени, и приложение не будет уничтожено при каждом его закрытии.

0 голосов
/ 08 апреля 2019

log(CacheInterface().getBitmap("key1")) //null

равно

val instance2 = CacheInterface()
log(instance2 .getBitmap("key1"))

instance1! = Instance2

изменить на Singleton

object CacheInterface{
...
}

использовать

CacheInterface.storeBitmap("key1",bitmap)
CacheInterface.getBitmap("key1")
...