Como título, ¿hay alguna forma de llamar a una función después del retraso (1 segundo, por ejemplo) Kotlin
?
Como título, ¿hay alguna forma de llamar a una función después del retraso (1 segundo, por ejemplo) Kotlin
?
Respuestas:
Puedes usar Schedule
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask (source)
ejemplo (gracias @Nguyen Minh Binh - lo encontré aquí: 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()
}
kotlin.concurrent.schedule
, porque Kotlin simplemente se quejó de una falta de coincidencia de firma, pero luego me di cuenta de que estaba tratando de pasar un Int en lugar de un Long. Se compiló después de corregir eso.
También hay una opción para usar Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
claseHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
claseTimer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
Corta
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
Mas corto
Timer().schedule(2000) {
TODO("Do something")
}
Executors
claseExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
Podrías launch
una corutina, delay
y luego llamar a la función:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
Si está fuera de una clase o un objeto, GlobalScope
haga que la corutina se ejecute allí; de lo contrario, se recomienda implementarla CoroutineScope
en la clase circundante, lo que permite cancelar todas las corutinas asociadas a ese alcance si es necesario.
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Timer.schedule()
espera un TimerTask
como su primer argumento. kotlin.concurrent.timerTask()
envuelve el lambda dado en una TimerTask
instancia. Ver aquí: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…
Timer
objeto no se va a utilizar más de una vez, por ejemplo, Timer().schedule(timerTask { ... }, 3000)
. También está disponible una opción más amigable para Kotlin; ver la respuesta de jonguer.
Un ejemplo simple para mostrar un brindis después de 3 segundos :
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
Si está buscando un uso genérico, aquí está mi sugerencia:
Crea una clase llamada como Run
:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
Y use así:
Run.after(1000, {
// print something useful etc.
})
Run.after(1000) { toRun() }
. ¿Estoy en lo cierto?
Le recomendé usar SingleThread porque no tiene que matarlo después de usarlo. Además, el método " stop ()" está en desuso en el lenguaje Kotlin.
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
Además, puede usarlo para trabajos periódicos. Es muy útil. Si desea hacer un trabajo por cada segundo, puede configurarlo porque los parámetros de la misma:
Executors.newSingleThreadScheduledExecutor (). ScheduleAtFixedRate (comando Runnable, long initialDelay, long period, TimeUnit unit);
Los valores de TimeUnit son: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS.
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }