Kotlin - 如何在 Handler 中像这样传递 Runnable

Kotlin - How to pass a Runnable as this in Handler

我是科特林的初学者。我尝试创建一个每 2 秒重复一次的任务。所以我创造了这样的东西。

val handler = Handler()
    handler.postDelayed(Runnable {
        // TODO - Here is my logic

        // Repeat again after 2 seconds
        handler.postDelayed(this, 2000)
    }, 2000)

但是在 postDelayed(this) 中它给出了错误 - required Runnable!, found MainActivity。我什至试过 this@Runnable 但没用。

但是当我像这样写同样的函数时,它起作用了

val handler = Handler()
    handler.postDelayed(object : Runnable {
        override fun run() {
            // TODO - Here is my logic

            // Repeat again after 2 seconds
            handler.postDelayed(this, 2000)
        }
    }, 2000)

那么为什么 this 关键字在第一个函数中不起作用,但在第二个函数中却很好用呢?

第一个是接受 lambda 和 returns Runnable 的函数。在这种情况下 this 没有任何意义。

第二个你定义了一个实现 Runnable 的匿名对象。在这种情况下 this 指的是该对象实例。

您有多种选择:

  1. 使 运行nable 和处理程序都在同一范围内

        //class scope
        val handler = Handler()
        val runnable = object : Runnable {
           override fun run () {
             handler.removeCallbacksAndMessages(null) 
             //make sure you cancel the 
              previous task in case you scheduled one that has not run yet
             //do your thing
    
             handler.postDelayed(runnable,time)
          }
       }
    

然后在一些函数中

handler.postDelayed(runnable,time)
  1. 你可以运行一个timertask,这种情况下会更好

     val task = TimerTask {
        override fun run() {
         //do your thing
        }
     }
    
     val timer = Timer()
    
     timer.scheduleAtFixedRate(task,0L, timeBetweenTasks)
    

下面的示例将起作用。

val runnable = object : Runnable { 
        override fun run() {
         
            handler.postDelayed(this,1000)
        }
    }

在您的情况下,当使用 this 时,它表示“local final class <no name provided> : Runnable”,请参考 header可运行。

runnable=object : Runnable {
            override fun run() {
                // i is a counter
                println("No. "+i++)
                // Repeat again after 2 seconds
                handler.postDelayed(this, 2000)
            }
        }
        handler.postDelayed(runnable,0)

其中 runnable 用于方法内部。由于 Handler() 弃用 ,我们必须这样使用:

var handler: Handler = Handler(Looper.getMainLooper())
var runnable: Runnable = Runnable { }

此外,您可以在任何地方通过以下方式停止此方法:

handler.removeCallbacks(runnable)