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

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

【问题讨论】:

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

标签: android kotlin handler runnable


【解决方案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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-20
        • 2014-08-21
        • 1970-01-01
        • 2014-12-29
        • 2019-03-09
        相关资源
        最近更新 更多