Middle
Znaš li kako funkcioniše keš karta?
sobes.tech АИ
Одговор од АИ
Кеш-карта (Memory Cache) у Android-у — тој механизам за чување података у оперативној меморији уређаја ради брзог приступа. Основана је на принципима асоцијативног кеша.
Како ради:
- Захтев за подацима: Када апликација тражи податке који могу бити кеширани (нпр. слика са интернета или резултат сложене операције), прво проверава кеш-карту.
- Проналажење у кешу: Ако су подаци пронађени у кешу (тј. кључ захтева одговара кључу у кешу), они се одмах враћају, избегавајући споре операције улаза-излаза или рачунања. Ово се назива "cache hit".
- Погрешка у кешу (Cache Miss): Ако подаци нису пронађени у кешу ("cache miss"), апликација их добија из оригиналног извора (мрежа, база података итд.).
- Смјештај у кеш: Након добијања, подаци се стављају у кеш-карту за будуће захтеве са истим кључем.
- Истискивање (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);
}