Назад к вопросам
Middle
67
questionbank

Знаешь, как работает кеш-карта?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Кеш-карта (Memory Cache) в Android — это механизм хранения данных в оперативной памяти устройства для быстрого доступа. Она основана на принципах ассоциативного кэша.

Как работает:

  1. Запрос данных: При запросе данных, которые могут быть кешированы (например, изображение из сети or результат сложной операции), приложение сначала проверяет кеш-карту.
  2. Поиск в кеше: Если данные найдены в кеше (т. е., ключ запроса совпадает с ключом в кеше), они сразу возвращаются, избегая медленных операций ввода-вывода or вычислений. Это называется "cache hit".
  3. Промах кеша (Cache Miss): Если данные не найдены в кеше ("cache miss"), приложение получает их из оригинального источника (сеть, база данных и т.д.).
  4. Помещение в кеш: После получения данные помещаются в кеш-карту для будущих запросов с тем же ключом.
  5. Вытеснение (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);
}