Android Studio Kotlin无法停止处理程序运行

uyto3xhc  于 2022-11-16  发布在  Android
关注(0)|答案(1)|浏览(158)

我正在运行一个更新textView元素的处理程序。该处理程序在单击按钮时启动和停止,但一旦启动,就无法停止。

fun updateTextView(handler: Handler, run: Boolean = true) {
    val runnable: Runnable = object : Runnable {
        override fun run() {
            // update text view element
            handler.postDelayed(this, 500)
        }
    }
    if (run) handler.postDelayed(runnable, 500)
    // this should stop it?
    else handler.removeCallbacks(runnable)
}

我的功能是检测点击

val textHandler = Handler(Looper.getMainLooper())

private fun setupClickListeners() {
    startLive.setOnClickListener{
        updateTextView(textHandler)
    }

    stopLive.setOnClickListener{
        updateTextView(textHandler, run = false)
    }
}
ghhaqwfi

ghhaqwfi1#

这是一种执行所需操作的通用方法:

// store an instance of your runnable task
val runnable: Runnable = object : Runnable {
    override fun run() {
        // update text view element
        handler.postDelayed(this, 500)
    }
}

fun startRunnable() {
    // you could just run it to get it going, since it posts itself
    runnable.run()
}

fun stopRunnable() {
    // remove this specific instance from the message queue
    handler.removeCallbacks(runnable)
}

就像我在评论中说的,你的版本在每次运行函数时都会创建一个 newRunnable示例--然后在将它发布到队列后,它会立即再次删除它。如果你没有删除它,它就会运行--但是你无法停止它,因为你没有存储对所创建示例的引用。因此不能将其传递给removeCallbacks。(再次运行该函数只会创建一个 newRunnable,因此取消它不会影响另一个函数。)
通过将Runnable存储为变量,您可以访问它--因此您可以轻松地将其传递给removeCallbacks,并通过再次发布它来重用它。(就像您有单独的任务在进行)-在这种情况下,您需要存储对所创建的每个Runnable的引用,并且有办法协调你要取消的

相关问题