284 votes

Comment appeler une fonction après un délai en Kotlin ?

Comme le titre l'indique, existe-t-il un moyen d'appeler une fonction après un délai (1 seconde par exemple) en Kotlin ?

268voto

Bogdan Ustyak Points 339

Il est également possible d'utiliser Handler -> postDelayed

 Handler().postDelayed({
                    //doSomethingHere()
                }, 1000)

43 votes

Veuillez ajouter qu'elle n'est disponible que sur Android, puisque la question demande une méthode kotlin générale (bien qu'elle ait le tag Android).

7 votes

Ce n'est pas constructif de votre part. En conséquence, lorsque les utilisateurs chercheront Android tag, ils pourraient penser que c'est une mauvaise réponse.

14 votes

Pour Android, il est préférable d'utiliser Handler plutôt que Timer : stackoverflow.com/questions/20330355/timertask-or-handler

240voto

Khemraj Points 8449

De nombreuses façons

1. Utilisation de Handler classe

Handler(getMainLooper()).postDelayed({
    TODO("Do something")
    }, 2000)

2. Utilisation de Timer classe

Timer().schedule(object : TimerTask() {
    override fun run() {
        TODO("Do something")
    }
}, 2000)

// Shorter

Timer().schedule(timerTask {
    TODO("Do something")
}, 2000)

// Shortest

Timer().schedule(2000) {
    TODO("Do something")
}

3. Utilisation de Executors classe

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)

4 votes

Et quelle est, selon vous, la meilleure solution ?

3 votes

Probablement le premier à utiliser un Handler. Voir stackoverflow.com/a/40339630/1159930

224voto

Matias Elorriaga Points 184

Vous pouvez utiliser Programme

inline fun Timer.schedule(
    delay: Long, 
    crossinline action: TimerTask.() -> Unit
): TimerTask (source)

exemple (merci @Nguyen Minh Binh - trouvé ici : http://jamie.mccrindle.org/2013/02/exploring-kotlin-standard-library-part-3.html )

import java.util.Timer
import kotlin.concurrent.schedule

Timer("SettingUp", false).schedule(500) { 
   doSomething()
}

17 votes

Merci ! Super facile. J'ai trouvé un exemple ici jamie.mccrindle.org/2013/02/ Timer("SettingUp", false).schedule(500) { doSomething() }

17 votes

Il compile, si vous ajoutez ces deux importations : import java.util.Timer et import kotlin.concurrent.schedule.

3 votes

@Matias Elorriaga, pour moi, mettre ceci sur un nouveau fichier de marque ne compile pas, même en ajoutant les importations Customizer dit

56voto

jonguer Points 261

Vous devez importer les deux bibliothèques suivantes :

import java.util.*
import kotlin.concurrent.schedule

et ensuite l'utiliser de cette façon :

Timer().schedule(10000){
    //do something
}

31voto

varghesekutty Points 91
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)

1 votes

Pouvez-vous m'expliquer pourquoi il est nécessaire d'écrire "timerTask" au lieu de simples accolades ?

3 votes

Je pense que oui. Timer.schedule() s'attend à ce qu'un TimerTask comme premier argument. kotlin.concurrent.timerTask() enveloppe le lambda donné dans un TimerTask instance. Voir ici : kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/

0 votes

De même, l'exemple donné peut être condensé en une seule ligne si l'option Timer ne sera pas utilisé plus d'une fois, par exemple, Timer().schedule(timerTask { ... }, 3000) . Une option plus adaptée à Kotlin est également disponible ; voir la réponse de jonguer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X