Kotlin - Как передать Runnable как это в Handler - PullRequest
0 голосов
/ 19 марта 2020

Я новичок в kotlin. Я пытаюсь создать задачу, которая будет повторяться каждые 2 секунды. Поэтому я создал что-то вроде этого.

val handler = Handler()
    handler.postDelayed(Runnable {
        // TODO - Here is my logic

        // Repeat again after 2 seconds
        handler.postDelayed(this, 2000)
    }, 2000)

Но в postDelayed (this) выдает ошибку - required Runnable!, found MainActivity. Я пробовал даже this@Runnable, но это не сработало.

Но когда я пишу такую ​​же функцию, как эта, она работает

val handler = Handler()
    handler.postDelayed(object : Runnable {
        override fun run() {
            // TODO - Here is my logic

            // Repeat again after 2 seconds
            handler.postDelayed(this, 2000)
        }
    }, 2000)

Так почему ключевое слово this не не работает в первой функции, но во второй она работает хорошо?

Ответы [ 2 ]

1 голос
/ 19 марта 2020

У вас есть несколько опций для go здесь:

  1. делает и исполняемый объект, и обработчик в одной области действия

       //class scope
       val handler = Handler()
       val runnable = Runnable {
    
            handler.removeCallbacksAndMessages(null) 
            //make sure you cancel the 
             previous task in case you scheduled one that has not run yet
            //do your thing
    
            handler.postDelayed(runnable,time)
    
      }
    

затем в некоторой функции

handler.postDelayed(runnable,time)

Вы можете запустить timertask, что было бы лучше в этом случае

val task = TimerTask {
   override fun run() {
    //do your thing
   }
}

val timer = Timer()

timer.scheduleAtFixedRate(task,0L, timeBetweenTasks)
1 голос
/ 19 марта 2020

Первая - это функция, которая принимает лямбду и возвращает Runnable. В этом случае this ничего не значит.

Второй - вы определяете анонимный объект, который реализует Runnable. В этом случае this относится к этому экземпляру объекта.

...