Назад к вопросам
Middle
67
questionbank
Знаешь, как работает кеш-карта?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Кеш-карта (Memory Cache) в Android — это механизм хранения данных в оперативной памяти устройства для быстрого доступа. Она основана на принципах ассоциативного кэша.
Как работает:
- Запрос данных: При запросе данных, которые могут быть кешированы (например, изображение из сети or результат сложной операции), приложение сначала проверяет кеш-карту.
- Поиск в кеше: Если данные найдены в кеше (т. е., ключ запроса совпадает с ключом в кеше), они сразу возвращаются, избегая медленных операций ввода-вывода or вычислений. Это называется "cache hit".
- Промах кеша (Cache Miss): Если данные не найдены в кеше ("cache miss"), приложение получает их из оригинального источника (сеть, база данных и т.д.).
- Помещение в кеш: После получения данные помещаются в кеш-карту для будущих запросов с тем же ключом.
- Вытеснение (Cache Eviction): Кеш имеет ограниченный размер. Когда он заполняется, старые or менее используемые элементы вытесняются, чтобы освободить место для новых. Распространенные алгоритмы вытеснения включают 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);
}