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

Posted

技术标签:

【中文标题】处理程序每​​ 5 秒运行一次任务 Kotlin【英文标题】:Handler to run task every 5 seconds Kotlin 【发布时间】:2017-12-30 11:11:20 【问题描述】:

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

【问题讨论】:

您可以递归地将Callable 传递给您的HandlersendMessageDelayed 请在问题中输入代码,不要链接到它,因为 a) 不是每个人都能下班到 imgur,b) 链接可能会过期,这个问题在未来将毫无用处。 感谢您告诉我! 【参考方案1】:

由于您不能引用当前所在的 lambda,并且在定义要分配给它的 lambda 时不能引用您定义的属性,所以这里最好的解决方案是 @ 987654321@:

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

假设此属性不是var,因为您实际上想在此自调用发生时更改它。

【讨论】:

谢谢,这正是我想要的!效果很好 我是否正确假设您可以创建一个默认处理程序(即 val handler:Handler = Handler())然后启动它(即 handler.post(runnableCode))它会每 5 次运行一次秒你放在运行块中的所有内容(在 handler.postDelayed... 之前)?【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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


private fun doSomethingRecursively () 
    ...
    waitToDoSomethingRecursively()

【讨论】:

【参考方案4】:

只需使用fixedRateTimer

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

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

【讨论】:

离开时别忘了收拾东西,例如在 android 上:myFixedRateTimer.cancel()【参考方案5】:

我推荐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)

【讨论】:

以上是关于处理程序每​​ 5 秒运行一次任务 Kotlin的主要内容,如果未能解决你的问题,请参考以下文章

我是否可以每1秒使用后台任务处理服务器中的数据?

Cron 作业——每 5 秒运行一次

每 5 分钟运行一次 Cron 作业,持续 10 秒

C# 要想给一个死循环设置循环时间间隔,每5秒循环一次。

怎么让windows计划任务每隔几分钟运行一次?

如何制作一个循环或每 5 秒执行一次任务然后自行重置的东西?