Храните состояние и выполняющуюся Job во ViewModel. Повторные клики во время ожидания игнорируйте, задержку делайте через delay, а после завершения обновляйте текст.
Задача: по клику на кнопку должна идти задержка 5 секунд, и текст 'Hello World' должен меняться на 'Goodbye World'. Напиши продакшн-решение с использованием любых библиотек (Compose, корутины и т.д.). При повторном нажатии дубликаты не должны учитываться.
Храните состояние и выполняющуюся 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 и не блокирует поток. Переживание смерти процесса — отдельное требование: для него сохраняют состояние и дедлайн, а не рассчитывают, что корутина продолжит жить.