Як заголовок, чи можна викликати функцію після затримки (наприклад, на 1 секунду) Kotlin
?
Як заголовок, чи можна викликати функцію після затримки (наприклад, на 1 секунду) Kotlin
?
Відповіді:
Ви можете використовувати Розклад
inline fun Timer.schedule(
delay: Long,
crossinline action: TimerTask.() -> Unit
): TimerTask (source)
приклад (спасибі @Nguyen Minh Binh - знайшов його тут: 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
, тому що Котлін просто скаржився на невідповідність підпису, але потім зрозумів, що намагаюся пройти Int замість Лонга. Він складений після виправлення цього.
Також є варіант використання Handler -> postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
Handler
класуHandler().postDelayed({
TODO("Do something")
}, 2000)
Timer
класуTimer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
Коротше
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
Найкоротший
Timer().schedule(2000) {
TODO("Do something")
}
Executors
класуExecutors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
Ви можете launch
розробити delay
це, а потім викликати функцію:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
Якщо ви перебуваєте за межами класу чи об'єкта, готуйте GlobalScope
до запуску програми, інакше рекомендується реалізувати CoroutineScope
в оточуючому класі, що дозволяє скасувати всі спроби, пов’язані з цією областю, якщо це необхідно.
val timer = Timer()
timer.schedule(timerTask { nextScreen() }, 3000)
Timer.schedule()
очікує TimerTask
, що це перший аргумент. kotlin.concurrent.timerTask()
загортає дану лямбда в TimerTask
екземпляр. Дивіться тут: kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…
Timer
об'єкт не буде використовуватися більш ніж один раз, наприклад, Timer().schedule(timerTask { ... }, 3000)
. Також доступний більш зручний для Котліна варіант; див. відповідь jonguer.
Простий приклад показати тост через 3 секунди :
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
Якщо ви шукаєте загальне використання, ось моя пропозиція:
Створіть клас, названий як Run
:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
І використовуйте так:
Run.after(1000, {
// print something useful etc.
})
Run.after(1000) { toRun() }
. Чи правильно я
Я рекомендував використовувати SingleThread, оскільки не потрібно вбивати його після використання. Також методом " stop ()" є застарілим мовою Котліна.
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
Більше того, ви можете використовувати його для періодичних робіт. Це дуже корисно. Якщо ви хочете виконувати роботу на кожну секунду, ви можете встановити через її параметри:
Execitors.newSingleThreadScheduledExecutor (). ГрафікAtFixedRate (команда Runnable, довгий початковий затримка, тривалий період, одиниця TimeUnit);
Значення TimeUnit: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS.
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }