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