每 5 秒处理一次 运行 任务 Kotlin
Handler to run task every 5 seconds Kotlin
我想每 5 秒 运行 一个特定的代码。我无法通过处理程序实现此目的。这在 Kotlin 中如何实现?这是我到目前为止所拥有的。还要注意,变量 Timer_Preview 是一个处理程序。
由于您无法引用当前所在的 lambda,并且在定义分配给它的 lambda 时无法引用您正在定义的 属性,因此最好的解决方案是 object
expression:
val runnableCode = object: Runnable {
override fun run() {
handler.postDelayed(this, 5000)
}
}
假设这个 属性 不是 var
因为你真的想在这个自调用发生时改变它。
由于 Kotlin 尚不允许递归 lambda(参见 KT-10350),您必须使用其他构造,例如 @zsmb13 的答案中的对象表达式,或如下的普通函数
fun StartTimer() {
Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}
fun runnable() {
//Code here
// Run code again after 5 seconds
Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}
但是,在您的特定情况下,您似乎可以再次调用 StartTimer()
来重新启动计时器,假设它不执行任何其他操作:
private val RunnableCode = Runnable {
//Code here
//Run code again after 5 seconds
StartTimer()
}
您可以使用简单的函数来做到这一点:
private fun waitToDoSomethingRecursively() {
handler.postDelayed(::doSomethingRecursively, 5000)
}
private fun doSomethingRecursively () {
...
waitToDoSomethingRecursively()
}
只需使用fixedRateTimer
fixedRateTimer("timer",false,0,5000){
this@MainActivity.runOnUiThread {
Toast.makeText(this@MainActivity, "text", Toast.LENGTH_SHORT).show()
}
}
通过为第三个参数设置另一个值来更改初始延迟。
我推荐了SingleThread,因为它非常好用。如果你想每秒做一次工作,你可以设置因为它的参数:
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
TimeUnit 值为:纳秒、微秒、毫秒、秒、分钟、小时、天。
示例:
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
我想每 5 秒 运行 一个特定的代码。我无法通过处理程序实现此目的。这在 Kotlin 中如何实现?这是我到目前为止所拥有的。还要注意,变量 Timer_Preview 是一个处理程序。
由于您无法引用当前所在的 lambda,并且在定义分配给它的 lambda 时无法引用您正在定义的 属性,因此最好的解决方案是 object
expression:
val runnableCode = object: Runnable {
override fun run() {
handler.postDelayed(this, 5000)
}
}
假设这个 属性 不是 var
因为你真的想在这个自调用发生时改变它。
由于 Kotlin 尚不允许递归 lambda(参见 KT-10350),您必须使用其他构造,例如 @zsmb13 的答案中的对象表达式,或如下的普通函数
fun StartTimer() {
Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}
fun runnable() {
//Code here
// Run code again after 5 seconds
Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}
但是,在您的特定情况下,您似乎可以再次调用 StartTimer()
来重新启动计时器,假设它不执行任何其他操作:
private val RunnableCode = Runnable {
//Code here
//Run code again after 5 seconds
StartTimer()
}
您可以使用简单的函数来做到这一点:
private fun waitToDoSomethingRecursively() {
handler.postDelayed(::doSomethingRecursively, 5000)
}
private fun doSomethingRecursively () {
...
waitToDoSomethingRecursively()
}
只需使用fixedRateTimer
fixedRateTimer("timer",false,0,5000){
this@MainActivity.runOnUiThread {
Toast.makeText(this@MainActivity, "text", Toast.LENGTH_SHORT).show()
}
}
通过为第三个参数设置另一个值来更改初始延迟。
我推荐了SingleThread,因为它非常好用。如果你想每秒做一次工作,你可以设置因为它的参数:
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
TimeUnit 值为:纳秒、微秒、毫秒、秒、分钟、小时、天。
示例:
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}