Нужны два механизма: кеш готовых изображений и реестр выполняющихся загрузок по 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.