处理程序每​​5秒运行一次任务Kotlin

时间:2017-07-24 18:42:01

标签: android kotlin handler runnable

我想每5秒运行一次代码。我无法通过处理程序实现此目的。怎么能在Kotlin完成?这是我到目前为止所拥有的。另外需要注意的是,变量Timer_Preview是一个处理程序。

My Code

5 个答案:

答案 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