我正在尝试用静态编程语言实现一个Android计时器,它将在定义的时间间隔触发一个事件。我不想使用TimerTask,因为它有记录的弱点(见这里),尽管可能有其他方法可以做到这一点,但我想在延迟后循环中使用Handler/Runnable。Java这是可能的,因为Runnable可以在初始化程序中引用自己,但是在静态编程语言中,这似乎是不可能的:
private fun startBoutiqueRefreshTimer(delayMs: Long) {
val handler = Handler()
val runnable = Runnable() {
EventManager.post(BoutiqueRefreshTimerEvent())
handler.postDelayed(runnable, delayMs)
}
handler.postDelayed(runnable, delayMs)
}
因为runnable不能在内部postDelayed调用中解析。静态编程语言显然阻止变量引用来自它们自己的初始化程序。
仍然使用Handler/Runnable方法的这个问题的好解决方案是什么?
这会管用的
val updateHandler = Handler()
val runnable = Runnable {
updateDisplay() // some action(s)
}
updateHandler.postDelayed(runnable, 5000).
private fun updateDisplay() {
Do actions
}
或者,如果您不太熟悉静态编程语言,请使用CtrlAltShiftK"编写代码并将android代码转换为静态编程语言。
你也可以使用这样的东西:
private fun startBoutiqueRefreshTimer(delayMs: Long) {
Handler().apply {
val runnable = object : Runnable {
override fun run() {
EventManager.post(BoutiqueRefreshTimerEvent())
postDelayed(this, delayMs)
}
}
postDelayed(runnable, delayMs)
}
}
我在这里使用application()
函数来简化Handler变量,并使用对象表达式来允许引用Runnable。
如您所见,当我使用对象表达式初始化Runnable
(而不是lambda)时,我可以使用this
来引用Runnable
对象。
您可以在单独的函数中移动要定期执行的例程:
val runnable = Runnable { doJob() }
fun doJob() {
EventManager.post(BoutiqueRefreshTimerEvent())
handler.postDelayed(runnable, delayMs)
}
请注意,变量runnable
需要在doJob()-函数的范围内可访问,这意味着如果您在类/对象中,它应该是类成员。