Задача: по клику на кнопку должна идти задержка 5 секунд, и текст 'Hello World' должен меняться на 'Goodbye World'. Напиши продакшн-решение с использованием любых библиотек (Compose, корутины и т.д.). При повторном нажатии дубликаты не должны учитываться.

Храните состояние и выполняющуюся Job во ViewModel. Повторные клики во время ожидания игнорируйте, задержку делайте через delay, а после завершения обновляйте текст.

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

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

Храните состояние и выполняющуюся Job во ViewModel. Повторные клики во время ожидания игнорируйте, задержку делайте через delay, а после завершения обновляйте текст.

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

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

Храните состояние и выполняющуюся Job во ViewModel. Повторные клики во время ожидания игнорируйте, задержку делайте через delay, а после завершения обновляйте текст.

Минимальное ядро решения; вызовы onClick предполагаются из главного потока:

class HelloViewModel : ViewModel() {
    private val _text = MutableStateFlow("Hello World")
    val text = _text.asStateFlow()
    private var pending: Job? = null

    fun onClick() {
        if (pending?.isActive == true || _text.value == "Goodbye World") return
        pending = viewModelScope.launch {
            delay(5_000)
            _text.value = "Goodbye World"
        }
    }
}

В Compose собирайте text с учётом lifecycle и вызывайте vm.onClick из Button. Job отменяется при очистке ViewModel и не блокирует поток. Переживание смерти процесса — отдельное требование: для него сохраняют состояние и дедлайн, а не рассчитывают, что корутина продолжит жить.

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

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

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

Подробнее