web-dev-qa-db-fra.com

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

En tant que titre, existe-t-il un moyen d'appeler une fonction après le délai (1 seconde par exemple) dans Kotlin?

90
Nguyen Minh Binh

Vous pouvez utiliser Schedule

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()
}
69
Matias Elorriaga

Il y a aussi une option pour utiliser Handler -> postDelayed

 Handler().postDelayed({
                    //doSomethingHere()
                }, 1000)
116
Bogdan Ustyak

Plusieurs façons

1. Utilisation de Handler class

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

2. Utilisation de Timer class

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

Plus court

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

Le plus court

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

3. Utilisation de Executors class

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

Vous devez importer les deux bibliothèques suivantes:

import Java.util.*
import kotlin.concurrent.schedule

et après cela, utilisez-le de cette manière:

Timer().schedule(10000){
    //do something
}
29
jonguer
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
15
varghesekutty

Vous pouvez launch une coroutine, delay puis appeler la fonction:

 /*GlobalScope.*/launch {
   delay(1000)
   yourFn()
 }

Si vous êtes en dehors d'une classe ou d'un objet, ajoutez GlobalScope au début afin de laisser la coroutine s'exécuter, sinon il est recommandé d'implémenter le CoroutineScope dans la classe environnante, ce qui permet d'annuler toutes les coroutines associées à cette portée si nécessaire .

11
Jonas Wilms

Un exemple simple pour montrer un toast après secondes:

fun onBtnClick() {
    val handler = Handler()
    handler.postDelayed({ showToast() }, 3000)
}

fun showToast(){
    Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
8
Zeero0

Si vous recherchez un usage générique, voici ma suggestion:

Créez une classe nommée Run:

class Run {
    companion object {
        fun after(delay: Long, process: () -> Unit) {
            Handler().postDelayed({
                process()
            }, delay)
        }
    }
}

Et utilisez comme ceci:

Run.after(1000, {
    // print something useful etc.
})
5
Ogulcan Orhan