Kotlin · 37 строк
При каждой остановке ленты preload получает 30 следующих клипов. Кэш — LinkedHashMap на 300 превью, общий для экрана. Если пользователь листает дальше, корутину предзагрузки отменяют. cdn.preview — suspend-функция, cdn.fallbackPreview — обычная блокирующая: читает заглушку с диска.
Отметьте строки с ошибками.
В работе: Android-приложение VK, экран ленты клипов.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: наша задача на данных VK: лента VK Клипов. Условие пересказано своими словами.
Давали на собеседовании?
import kotlinx.coroutines.*import kotlinx.coroutines.sync.Muteximport kotlinx.coroutines.sync.withLockclass PreviewPreloader(private val cdn: Cdn,private val cache: MutableMap<Long, ByteArray>,private val log: Logger,) {private val mutex = Mutex()var loaded = 0private set// Предзагрузка превью следующих 30 клипов.suspend fun preload(clipIds: List<Long>) = coroutineScope {clipIds.forEach { id ->launch(Dispatchers.IO) {val bytes = runCatching { cdn.preview(id) }.getOrElse { e ->log.warn("превью $id не загрузилось", e)cdn.fallbackPreview(id)}put(id, bytes)loaded++}}}private suspend fun put(id: Long, bytes: ByteArray) = mutex.withLock {cache[id] = bytesif (cache.size > 300) evictOldest()}private suspend fun evictOldest() = mutex.withLock {val oldest = cache.keys.first()cache.remove(oldest)}}