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

Handler to run task every 5 seconds Kotlin

我想每 5 秒 运行 一个特定的代码。我无法通过处理程序实现此目的。这在 Kotlin 中如何实现?这是我到目前为止所拥有的。还要注意,变量 Timer_Preview 是一个处理程序。

由于您无法引用当前所在的 lambda,并且在定义分配给它的 lambda 时无法引用您正在定义的 属性,因此最好的解决方案是 object expression:

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

假设这个 属性 不是 var 因为你真的想在这个自调用发生时改变它。

由于 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()
}

您可以使用简单的函数来做到这一点:

private fun waitToDoSomethingRecursively() {
    handler.postDelayed(::doSomethingRecursively, 5000)
}

private fun doSomethingRecursively () {
    ...
    waitToDoSomethingRecursively()
}

只需使用fixedRateTimer

 fixedRateTimer("timer",false,0,5000){
        this@MainActivity.runOnUiThread {
            Toast.makeText(this@MainActivity, "text", Toast.LENGTH_SHORT).show()
        }
    }

通过为第三个参数设置另一个值来更改初始延迟。

我推荐了SingleThread,因为它非常好用。如果你想每秒做一次工作,你可以设置因为它的参数:

Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

TimeUnit 值为:纳秒、微秒、毫秒、秒、分钟、小时、天。

示例:

private fun mDoThisJob(){

    Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
        //TODO: You can write your periodical job here..!

    }, 1, 1, TimeUnit.SECONDS)
}