Sobes.tech
Middle

Znaš li kako funkcioniše keš karta?

sobes.tech АИ

Одговор од АИ

Кеш-карта (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);

    // Добијање максималне доступне величине меморије за апликацију (у КБ)
    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) {
            // Метод за израчунавање величине сваког елемента у кешу у јединицама,
            // одговарајућим величини кеша (овде - КБ)
            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);
}