W tytule, czy istnieje sposób wywołania funkcji po opóźnieniu (na przykład 1 sekundę) w Kotlin
?
W tytule, czy istnieje sposób wywołania funkcji po opóźnieniu (na przykład 1 sekundę) w Kotlin
?
Odpowiedzi:
Możesz użyć harmonogramu
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask (source)
przykład (dzięki @Nguyen Minh Binh - znalazłem go tutaj: 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
, ponieważ Kotlin tylko narzekał na niezgodność podpisu, ale potem zdałem sobie sprawę, że próbuję przekazać Int zamiast Long. Został skompilowany po poprawieniu tego.
Istnieje również opcja użycia Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
klasyHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
klasyTimer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
Krótszy
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
Najkrótsza
Timer().schedule(2000) {
TODO("Do something")
}
Executors
klasyExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
Mógłbyś launch
coroutine, delay
a następnie wywołać funkcję:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
Jeśli jesteś poza klasą lub obiektem, GlobalScope
dołącz poprzednik, aby pozwolić programowi działać w tym miejscu, w przeciwnym razie zaleca się zaimplementowanie CoroutineScope
w otaczającej klasie, co pozwala w razie potrzeby anulować wszystkie procedury powiązane z tym zakresem.
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Timer.schedule()
oczekuje, że TimerTask
jako pierwszy argument. kotlin.concurrent.timerTask()
zawija podaną lambdę w TimerTask
instancji. Zobacz tutaj: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…
Timer
obiekt nie będzie używany więcej niż raz, np Timer().schedule(timerTask { ... }, 3000)
.. Dostępna jest również opcja bardziej przyjazna Kotlinowi; zobacz odpowiedź Jonguera.
Prosty przykład pokazujący toast po 3 sekundach :
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
Jeśli szukasz ogólnego zastosowania, oto moja sugestia:
Utwórz klasę o nazwie Run
:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
I użyj w ten sposób:
Run.after(1000, {
// print something useful etc.
})
Run.after(1000) { toRun() }
. Czy mam rację
Polecam używanie SingleThread, ponieważ nie musisz go zabijać po użyciu. Ponadto metoda „ stop ()” jest przestarzała w języku Kotlin.
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
Ponadto możesz go używać do pracy okresowej. To jest bardzo użyteczne. Jeśli chcesz wykonywać pracę na każdą sekundę, możesz ustawić jej parametry:
Executors.newSingleThreadScheduledExecutor (). ScheduleAtFixedRate (polecenie Runnable, long initialDelay, long period, unit TimeUnit);
Wartości TimeUnit to: NANOSECONDS, MICROSECONDS, MILISECONDS, SECONDS, MINUTES, HOURS, DAYS.
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }