Задать вопрос
@NovichokIvanovich
начинающий программист

Как передать this в handler.postDelayed kotlin?

Ошибка возникает в параметре this переданном в метод handler.postDelayed
class MainActivity : AppCompatActivity() {
    private var s:Int = 0
    private var running: Boolean = false
    fun onClickStart(view: View) {
        running = true
    }
    fun onClickStop(view: View) {
        running = false
    }
    fun onClickReset(view: View) {
        running = false
        s = 0
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        runTimer()
    }

    private fun runTimer() {
        val time_view = findViewById<TextView>(R.id.time_view)
        val handler: Handler = Handler()
        handler.post(
            Runnable {
                @Override
                fun run() {
                    var hours:Int = s/3600
                    var minutes: Int = (s%3600)/60
                    var secs:Int = s%60
                    var time:String = String.format(Locale.getDefault(), "%d:%02d:%02d", hours, minutes, secs)
                    time_view.setText(time)
                    if(running) {
                        s++
                    }
                    handler.postDelayed(this,1000)
                }
            }
        )

    }
}
  • Вопрос задан
  • 793 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
ошибка у тебя в определении Runnable
Runnable {
                @Override
                fun run() {

В котлине так не пишут. Здесь ты объявил лямбду, а внутри неё - функцию run. Override просто игнорируется. this будет объемлющим классом.
Правильно будет так
object: Runnable {
    override fun run() {
        handler.postDelayed(this)
    }
}


То, что ты хотел сделать, это лямбда, реализующая джавовый SAM-интерфейс. Так делать можно, если тебе внутри не нужен this. Выглядеть будет так:
Runnable {
   //тут код, который должен быть в run()
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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