答案 0 :(得分:14)
由于您无法引用当前所在的lambda,并且在定义要分配给它的lambda时无法引用所定义的属性,因此这里的最佳解决方案是{ {3}}:
val runnableCode = object: Runnable {
override fun run() {
handler.postDelayed(this, 5000)
}
}
假设此属性不是var
,因为您实际上想要在发生此自我调用时更改它。
答案 1 :(得分:3)
由于Kotlin还不允许递归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()
}
答案 2 :(得分:3)
我推荐 SingleThread ,因为它非常有用。如果您想每秒进行一次工作,则可以进行设置,因为它的参数:
Executors.newSingleThreadScheduledExecutor()。scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit);
TimeUnit值是:NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS。
示例:
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
@canerkaseler
答案 3 :(得分:2)
只需使用fixedRateTimer
fixedRateTimer("timer",false,0,5000){
this@MainActivity.runOnUiThread {
Toast.makeText(this@MainActivity, "text", Toast.LENGTH_SHORT).show()
}
}
通过为第三个参数设置另一个值来更改初始延迟。
答案 4 :(得分:0)
您可以使用简单的功能来做到这一点:
AllowedProducts