在Kotlin用Handler写一个计时器

我试图在Kotlin中实现一个Android定时器,它将在指定的时间间隔内触发一个事件。 我不想使用TimerTask由于其记录的弱点( 见这里 ),虽然有可能的其他方法来做到这一点,我想使用后处理循环中的处理程序/ Runnable。 在Java中,这是可能的,因为Runnable可以在初始化器中引用它自己,但是在Kotlin中似乎这是不可能的:

private fun startBoutiqueRefreshTimer(delayMs: Long) { val handler = Handler() val runnable = Runnable() { EventManager.post(BoutiqueRefreshTimerEvent()) handler.postDelayed(runnable, delayMs) } handler.postDelayed(runnable, delayMs) } 

因为runnable无法在内部postDelayed调用中解析。 Kotlin显然可以防止在他们自己的初始化程序中引用变量。

什么是这个问题的一个很好的解决方案,仍然使用Handler / Runnable方法?

您可以在一个单独的函数中定期移动要执行的例程:

 val runnable = Runnable { doJob() } fun doJob() { EventManager.post(BoutiqueRefreshTimerEvent()) handler.postDelayed(runnable, delayMs) } 

请注意,变量runnable需要在doJob()函数的作用域中可访问,这意味着如果您在类/对象中,它应该是类成员。

你也可以使用这样的东西:

 private fun startBoutiqueRefreshTimer(delayMs: Long) { Handler().apply { val runnable = object : Runnable { override fun run() { EventManager.post(BoutiqueRefreshTimerEvent()) postDelayed(this, delayMs) } } postDelayed(runnable, delayMs) } } 

我在这里apply()函数来简化Handler变量,并使用对象表达式来引用Runnable。

正如你所看到的,当我使用对象表达式来初始化Runnable (而不是lambda)时,我可以使用this来引用Runnable对象。

这将工作

 val updateHandler = Handler() val runnable = Runnable { updateDisplay() // some action(s) } updateHandler.postDelayed(runnable, 5000). private fun updateDisplay() { Do actions } 

或者,如果你不太熟悉Kotlin,请编写代码并使用Ctrl + Alt + Shift + K将你的Android代码转换为Kotlin。