Как обновить пользовательский интерфейс во время работы?

В процессе изучения kotlin и android studio решил сделать, казалось бы, банальную вещь: таймер. Всего-то вот тебе button, вот тебе textView, нажал на кнопку, цикл for запустился и знай себе подставляет новое значение в textView, засыпает на секунду и по новой. Но узнал маленький нюанс: все элементы пользовательского интерфейса отказываются обновляться до завершения onResume (по крайней мере, это то, как это выглядит). И поэтому такой код:

override fun onResume() {
    super.onResume()
    
    for(i in 1..10) {
        bindingClass.textView.text = i.toString()
        Thread.sleep(1000)
    }
}

Приводит лишь к тому, что приложение будто зависает на 10 секунд, а потом сразу показывает "10" на экране. Пробовал запустить в отдельной сопрограмме через runBlocking { launch {} } , но результат тот же.

Какой самый оптимальный способ добиться нужного результата? И неужели обновлять пользовательский интерфейс во время работы приложения настолько редкая задача, что в котлине не добавили какой-нибудь заготовленный способ это сделать? По крайней мере, мне не удалось его найти
  • Вопрос задан
  • 900 просмотров
Решения вопроса 1
@surodeev_artem
Как вариант, можно использовать Handler:

На уровне класса:
lateinit var timer: Runnable

В функции:
val handler = Handler()
var iterator = 1
timer = Runnable() {
        textview.text = iterator.toString()
        if (iterator++ < 10) {
                handler.postDelayed(timer, 1000)
        }
}
handler.post(timer)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы