web-dev-qa-db-fra.com

Gestionnaire pour exécuter la tâche toutes les 5 secondes Kotlin

Je voudrais exécuter un certain code toutes les 5 secondes. J'ai du mal à y parvenir avec un gestionnaire. Comment cela peut-il être fait à Kotlin? Voici ce que j'ai jusqu'à présent. À noter également, la variable Timer_Preview est un gestionnaire.

 My Code

6
Ryan Dailey

Etant donné que vous ne pouvez pas référencer un lambda dans lequel vous êtes actuellement, ni la propriété que vous définissez pendant que vous définissez le lambda que vous lui affectez, la meilleure solution est ici une expression object :

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

En supposant que cette propriété ne soit pas une var parce que vous voulez réellement la changer pendant que cette autoappel est en cours.

9
zsmb13

Comme Kotlin n'autorise pas encore les lambdas récursifs (voir KT-10350 ), vous devez utiliser d'autres constructions, telles que des expressions d'objet comme dans la réponse de @ zsmb13 ou des fonctions ordinaires comme ci-dessous

fun StartTimer() {
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}

fun runnable() {
    //Code here

    // Run code again after 5 seconds
    Timer_Preview.postDelayed(Runnable { runnable() }, 5000)
}

Cependant, dans votre cas particulier, il semble que vous puissiez simplement appeler à nouveau StartTimer() pour réarmer le chronomètre, en supposant que cela ne fasse rien d'autre:

private val RunnableCode = Runnable {
    //Code here

    //Run code again after 5 seconds
    StartTimer()
}
2
ephemient

Utilisez simplement fixedRateTimer

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

Modifiez le délai initial en définissant une autre valeur pour le troisième paramètre.

1
Morteza Rastgoo

Vous pouvez le faire avec des fonctions simples: 

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

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