Создание простого загрузчика изображений

Нужны два механизма: кеш готовых изображений и реестр выполняющихся загрузок по URL. Все параллельные потребители одного ключа ожидают одну общую задачу, а не создают свои HTTP-запросы.

Короткий ответ

Что ответить на собеседовании

Нужны два механизма: кеш готовых изображений и реестр выполняющихся загрузок по URL. Все параллельные потребители одного ключа ожидают одну общую задачу, а не создают свои HTTP-запросы.

Подробный разбор

Ответ с пояснениями

Условие

Требуется разработать небольшую библиотеку, способную получать изображения по указанному URL и выводить их в объекте ImageView. При одновременных запросах одной и той же картинки запрос к сети должен выполняться лишь один раз, а результат использовать повторно.

// Fragment
fun onCreateView(...) {
    ...
    val imageView: ImageView ...
    val url: Uri = ...

    // Пример использования
}

// Реализация библиотеки

// Утилиты:
@WorkerThread
fun loadBytes(url: Uri): ByteArray
fun createBitmap(byteArray: ByteArray): Bitmap

Ответ

Нужны два механизма: кеш готовых изображений и реестр выполняющихся загрузок по URL. Все параллельные потребители одного ключа ожидают одну общую задачу, а не создают свои HTTP-запросы.

Под Mutex атомарно проверяют кеш и map<key, Deferred<Bitmap>>; ожидание сети выполняют уже вне блокировки. loadBytes и декодирование работают не на UI-потоке. Общая задача принадлежит scope загрузчика, чтобы отмена одного ImageView не отменяла остальных. При завершении запись удаляют в finally, ошибку не кешируют как успешный результат. Перед установкой bitmap на Main проверяют, что View всё ещё ожидает этот URL. Нужны ограниченный LRU-кеш, уменьшение изображения до размера назначения и освобождение ссылок по lifecycle.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее