web-dev-qa-db-ja.com

5秒ごとにタスクを実行するハンドラーKotlin

特定のコードを5秒ごとに実行したいと思います。ハンドラーでこれを達成するのに問題があります。 Kotlinでこれを行うにはどうすればよいですか?これが私がこれまで持ってきたものです。また、変数Timer_Previewはハンドラです。

My Code

13
Ryan Dailey

現在使用しているラムダを参照することはできず、割り当てているラムダを定義しているときに定義しているプロパティを参照することはできないため、ここでの最良の解決策は object

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

このプロパティはvarではないと仮定します。これは、この自己呼び出しが行われている間に実際に変更したいためです。

16
zsmb13

単にfixedRateTimerを使用

 fixedRateTimer("timer",false,0,5000){
        [email protected] {
            Toast.makeText(this@MainActivity, "text", Toast.LENGTH_SHORT).show()
        }
    }

3番目のパラメーターに別の値を設定して、初期遅延を変更します。

6
Morteza Rastgoo

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()
}
_
3
ephemient

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

1
canerkaseler

簡単な関数でこれを行うことができます:

private fun waitToDoSomethingRecursively() {
    handler.postDelayed(::doSomethingRecursively, 5000)
}

private fun doSomethingRecursively () {
    ...
    waitToDoSomethingRecursively()
}
0
Wojtek Okoński