Как видно из заголовка, есть ли способ вызвать функцию после задержки (например, 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
, потому что Kotlin просто пожаловался на несоответствие подписи, но затем я понял, что пытаюсь передать Int вместо Long. Он скомпилирован после исправления этого.
Также есть возможность использовать 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)
. Доступен также вариант, более дружественный к Kotlin; см. ответ Джонгуэра.
Простой пример показа тоста через 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)
}
Более того, вы можете использовать его для периодической работы. Это очень полезно. Если вы хотите выполнять задание каждую секунду, вы можете установить его параметры:
Executors.newSingleThreadScheduledExecutor (). ScheduleAtFixedRate (команда Runnable, длинная начальная задержка, длинный период, единица TimeUnit);
Значения TimeUnit: наносекунды, микросекунды, миллисекунды, секунды, минуты, часы, дни.
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }