在Kotlin中使用Handler编写计时器

时间:2017-09-01 13:55:51

标签: android kotlin

我试图在Kotlin中实现Android计时器,该计时器将以定义的时间间隔触发事件。由于其记录的弱点(see here),我不想使用TimerTask,虽然还有其他方法可以做到这一点,但我想在后延迟循环中使用Handler / Runnable。在Java中,这是可能的,因为Runnable可以在初始化器中引用它自己,但是在Kotlin中似乎这是不可能的:

private fun startBoutiqueRefreshTimer(delayMs: Long) {
    val handler = Handler()
    val runnable = Runnable() {
        EventManager.post(BoutiqueRefreshTimerEvent())
        handler.postDelayed(runnable, delayMs)
    }
    handler.postDelayed(runnable, delayMs)
}

因为无法在内部postDelayed调用中解析runnable。 Kotlin显然阻止了自己的初始化程序中的变量引用。

仍然使用Handler / Runnable方法,对这个问题有什么好处?

4 个答案:

答案 0 :(得分:6)

您也可以使用以下内容:

private fun startBoutiqueRefreshTimer(delayMs: Long) {
    Handler().apply {
        val runnable = object : Runnable {
            override fun run() {
                EventManager.post(BoutiqueRefreshTimerEvent())
                postDelayed(this, delayMs)
            }
        }
        postDelayed(runnable, delayMs)
    }
}

我在这里使用apply()函数来简化Handler变量,并使用object expression来允许引用Runnable。

如您所见,当我使用对象表达式初始化Runnable(而不是lambda)时,我可以使用this来引用Runnable对象。

答案 1 :(得分:4)

这将有效

val updateHandler = Handler()

    val runnable = Runnable {
        updateDisplay() // some action(s)
    }

    updateHandler.postDelayed(runnable, 5000).

private fun updateDisplay() {
      Do actions
}

或者,如果您对Kotlin不太熟悉,请编写代码并使用 Ctrl + Alt + Shift + ķ&#34 ;.

答案 2 :(得分:3)

您可以在一个单独的函数中定期移动您想要执行的例程:

val runnable = Runnable { doJob() }

fun doJob() {
    EventManager.post(BoutiqueRefreshTimerEvent())
    handler.postDelayed(runnable, delayMs)
}

请注意,变量runnable需要在doJob() - 函数的范围内可访问,这意味着它应该是类成员,如果您在类/对象中。

答案 3 :(得分:0)

这对我有用,Hanlder使用postDelayed

    override fun onCreateView(inflater: LayoutInflater?, container: 
    ViewGroup?, savedInstanceState: Bundle?): View? {
    val handler = Handler()
    handler.postDelayed(mSplashHandler,1500)
    return view
    }

   internal var mSplashHandler: Runnable = Runnable {
   // your code to do after handler completes
   }