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
指的是该对象实例。
您有多种选择:
使 运行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)
你可以运行一个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)
我是科特林的初学者。我尝试创建一个每 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
指的是该对象实例。
您有多种选择:
使 运行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)
你可以运行一个
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)