Como o título, existe alguma maneira de chamar uma função após um atraso (1 segundo por exemplo) em Kotlin
?
Como o título, existe alguma maneira de chamar uma função após um atraso (1 segundo por exemplo) em Kotlin
?
Respostas:
Você pode usar o Schedule
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask (source)
exemplo (obrigado @Nguyen Minh Binh - encontre-o aqui: 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 apenas reclamou de uma incompatibilidade de assinatura, mas então percebi que estava tentando passar um Int em vez de um Long. Compilou depois de corrigir isso.
Há também uma opção para usar Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
classeHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
classeTimer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
Mais curta
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
Mais curto
Timer().schedule(2000) {
TODO("Do something")
}
Executors
classeExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
Você poderia launch
uma corotina, delay
e depois chamar a função:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
Se você estiver fora de uma classe ou objeto antes GlobalScope
de permitir que a corotina seja executada lá, caso contrário, é recomendável implementar a CoroutineScope
classe circundante, o que permite cancelar todas as corotinas associadas a esse escopo, se necessário.
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Timer.schedule()
espera um TimerTask
como é o primeiro argumento. kotlin.concurrent.timerTask()
agrupa o lambda fornecido em uma TimerTask
instância. Veja aqui: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…
Timer
objeto não for usado mais de uma vez, por exemplo Timer().schedule(timerTask { ... }, 3000)
,. Uma opção mais amigável para Kotlin também está disponível; veja a resposta do jonguer.
Um exemplo simples para mostrar um brinde após 3 segundos :
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
Se você estiver procurando por uso genérico, aqui está minha sugestão:
Crie uma classe chamada como Run
:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
E use assim:
Run.after(1000, {
// print something useful etc.
})
Run.after(1000) { toRun() }
. Estou correto
Eu recomendei o uso do SingleThread porque você não precisa matá-lo após o uso. Além disso, o método " stop ()" foi descontinuado no idioma Kotlin.
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
Além disso, você pode usá-lo para trabalhos periódicos. É muito útil. Se você deseja fazer o trabalho a cada segundo, é possível definir os parâmetros:
Executors.newSingleThreadScheduledExecutor (). ScheduleAtFixedRate (comando Runnable, long initialDelay, longo período, unidade TimeUnit);
Os valores de TimeUnit são: NANOSECONDS, MICROSECONDS, MILISECONDS, SECONDS, MINUTES, HOURS, DIAS.
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }