2017-07-24 280 views
4

我想每5秒运行一段代码。我在处理程序中遇到了麻烦。 Kotlin如何做到这一点?这是我到目前为止。还要注意,变量Timer_Preview是一个Handler。处理程序每​​5秒运行一次任务Kotlin

My Code

+0

你可以传递一个'Callable'你'Handler'和'sendMessageDelayed'递归。 –

+1

请把代码放在问题中,而不是链接到它,因为a)不是每个人都可以从工作中得到imgur和b)链接可能会过期,并且这个问题在将来将没有用处。 – Todd

+0

谢谢你让我知道! –

回答

4

既然你不能引用拉姆达目前在你,你不能引用你当你确定你分配给它的拉姆达定义属性时,这里最好的解决方案是一个object expression

val runnableCode = object: Runnable { 
    override fun run() { 
     handler.postDelayed(this, 5000) 
    } 
} 

假设这个属性不是var因为你真正想要,而这种自我呼叫正在发生的事情去改变它。

+0

谢谢,这正是我一直在寻找的!很好的 –

+0

我是否正确地假设你可以创建一个默认处理程序(即val处理程序:Handler = Handler()),然后启动它(即handler.post(runnableCode)),它会每隔5秒运行一次你放入运行块(在handler.postDelayed之前...)? –

+0

我相信会有效,是的。 – zsmb13

1

由于科特林还不允许递归lambda表达式(见KT-10350),您必须使用其他结构,如对象表述为@ zsmb13的答案,还是普通的功能如下

fun StartTimer() { 
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000) 
} 

fun runnable() { 
    //Code here 

    // Run code again after 5 seconds 
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000) 
} 

然而,在您的特定情况下,它看起来像你可以只调用StartTimer()再重新布防计时器,假设它不会做任何事情:

private val RunnableCode = Runnable { 
    //Code here 

    //Run code again after 5 seconds 
    StartTimer() 
}