Middle
Знаеш ли как работи кеш картата?
sobes.tech AI
Отговор от AI
Кеш памет (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);
// Получаване на максималния наличен размер на паметта за приложението (в 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);
}