Sobes.tech
Middle

Знаеш ли как работи кеш картата?

sobes.tech AI

Отговор от AI

Кеш памет (Memory Cache) в Android е механизъм за съхранение на данни в оперативната памет на устройството за бърз достъп. Той се базира на принципите на асоциативния кеш.

Как работи:

  1. Заявка за данни: Когато се изискват данни, които могат да бъдат кеширани (например изображение от мрежата или резултат от сложна операция), приложението първо проверява кеша.
  2. Търсене в кеша: Ако данните бъдат намерени в кеша (т.е. ключът на заявката съвпада с ключа в кеша), те се връщат незабавно, избягвайки бавни операции за вход/изход или изчисления. Това се нарича "cache hit".
  3. Грешка при кеша (Cache Miss): Ако данните не бъдат намерени в кеша ("cache miss"), приложението ги получава от оригиналния източник (мрежа, база данни и т.н.).
  4. Поставяне в кеша: След получаване, данните се поставят в кеша за бъдещи заявки с същия ключ.
  5. Изтласкване (Cache Eviction): Кешът има ограничен размер. Когато се запълни, старите или по-малко използваните елементи се изтласкват, за да се освободи място за нови. Често използваните алгоритми за изтласкване включват LRU (Least Recently Used) и LFU (Least Frequently Used).

Пример за реализация в Android с използване на LruCache:

// Създаване на LruCache с максимален размер
private LruCache<String, Bitmap> memoryCache;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Получаване на максималния наличен размер на паметта за приложението (в KB)
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

    // Използване на 1/8 от наличната памет за кеша
    final int cacheSize = maxMemory / 8;

    memoryCache = new LruCache<String, Bitmap>(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            // Метод за изчисляване на размера на всеки елемент в кеша в единици,
            // тук - KB
            return bitmap.getByteCount() / 1024;
        }
    };
}

// Добавяне на елемент в кеша
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        memoryCache.put(key, bitmap);
    }
}

// Получаване на елемент от кеша
public Bitmap getBitmapFromMemCache(String key) {
    return memoryCache.get(key);
}