android - Kotlin - 如何在 Handler 中传递一个 Runnable

标签 android kotlin handler runnable

我是 kotlin 的初学者。我尝试创建一个每 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关键字在第一个功能中不起作用,但在第二个功能中效果很好?

最佳答案

您有几种选择:

  • 使可运行对象和处理程序都在同一范围内
        //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)
    
  • 您可以运行 timertask , 在这种情况下会更好
     val task = TimerTask {
        override fun run() {
         //do your thing
        }
     }
    
     val timer = Timer()
    
     timer.scheduleAtFixedRate(task,0L, timeBetweenTasks)
    
  • 关于android - Kotlin - 如何在 Handler 中传递一个 Runnable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60761647/

    相关文章:

    android - 底部栏导航未显示所有标题

    javascript 错误和异常处理程序

    android - 切换到 Gradle : why do I have to keep custom views from being obfuscated?

    Android Firebase云函数通知

    android - 如何收听已连接电源的 Android > 8

    java - Android Media Codec API 基本示例

    java - Android:为什么我不能在新线程中创建处理程序

    java - android:处理程序根本不工作

    Android Espresso 如何测试从不同路径流向特定 Activity

    android - Firebase Cloud Messaging -> Android 中的非法状态异常