我正在尝试在Kotlin中实现一个Android计时器,它将以定义的时间间隔触发事件.我不想使用TimerTask,因为它有记录的弱点(见这里),虽然还有其他方法可以做到这一点,但我想在后延迟循环中使用Handler/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)
}
Run Code Online (Sandbox Code Playgroud)
因为runnable无法在内部postDelayed调用中解析.Kotlin显然阻止了自己的初始化程序中的变量引用.
什么是这个问题的好方法,仍然使用Handler/Runnable方法?
你也可以使用这样的东西:
private fun startBoutiqueRefreshTimer(delayMs: Long) {
Handler().apply {
val runnable = object : Runnable {
override fun run() {
EventManager.post(BoutiqueRefreshTimerEvent())
postDelayed(this, delayMs)
}
}
postDelayed(runnable, delayMs)
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里使用apply()函数来简化Handler变量,并使用对象表达式来引用Runnable.
正如您所看到的,当我使用对象表达式初始化Runnable(而不是lambda)时,我可以this用来引用Runnable对象.
您可以在单独的函数中移动要定期执行的例程:
val runnable = Runnable { doJob() }
fun doJob() {
EventManager.post(BoutiqueRefreshTimerEvent())
handler.postDelayed(runnable, delayMs)
}
Run Code Online (Sandbox Code Playgroud)
请注意,变量runnable需要在 doJob() 函数的范围内可访问,这意味着它应该是类成员,如果您在类/对象中。
小智 5
这会起作用
val updateHandler = Handler()
val runnable = Runnable {
updateDisplay() // some action(s)
}
updateHandler.postDelayed(runnable, 5000).
private fun updateDisplay() {
Do actions
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您对Kotlin不太熟悉,请编写代码,然后使用Ctrl+ Alt+ Shift+ K“ 将android代码转换为Kotlin 。
| 归档时间: |
|
| 查看次数: |
9286 次 |
| 最近记录: |