特定のコードを5秒ごとに実行したいと思います。ハンドラーでこれを達成するのに問題があります。 Kotlinでこれを行うにはどうすればよいですか?これが私がこれまで持ってきたものです。また、変数Timer_Previewはハンドラです。
現在使用しているラムダを参照することはできず、割り当てているラムダを定義しているときに定義しているプロパティを参照することはできないため、ここでの最良の解決策は object
式 :
val runnableCode = object: Runnable {
override fun run() {
handler.postDelayed(this, 5000)
}
}
このプロパティはvar
ではないと仮定します。これは、この自己呼び出しが行われている間に実際に変更したいためです。
単にfixedRateTimer
を使用
fixedRateTimer("timer",false,0,5000){
[email protected] {
Toast.makeText(this@MainActivity, "text", Toast.LENGTH_SHORT).show()
}
}
3番目のパラメーターに別の値を設定して、初期遅延を変更します。
Kotlinはまだ再帰的なラムダを許可していないため( KT-1035 を参照)、@ 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()
}
_
SingleThreadをお勧めします。あなたが毎秒仕事をしたいなら、あなたはそのパラメータのために設定することができます:
Executors.newSingleThreadScheduledExecutor()。scheduleAtFixedRate(Runnable command、long initialDelay、long period、TimeUnit unit);
TimeUnitの値は、NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS、MINUTES、HOURS、DAYSです。
例:
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
@canerkaseler
簡単な関数でこれを行うことができます:
private fun waitToDoSomethingRecursively() {
handler.postDelayed(::doSomethingRecursively, 5000)
}
private fun doSomethingRecursively () {
...
waitToDoSomethingRecursively()
}