En tant que titre, existe-t-il un moyen d'appeler une fonction après le délai (1 seconde par exemple) dans Kotlin
?
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()
}
Il y a aussi une option pour utiliser Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
classHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
classTimer().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")
}
Executors
classExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
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
}
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
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 .
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()
}
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.
})