Как видно из заголовка, есть ли способ вызвать функцию после задержки (например, 1 секунда) Kotlin
?
173
Вы можете использовать расписание
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()
}
Timer("SettingUp", false).schedule(500) { doSomething() }
kotlin.concurrent.schedule
, потому что Kotlin просто пожаловался на несоответствие подписи, но затем я понял, что пытаюсь передать Int вместо Long. Он скомпилирован после исправления этого.Также есть возможность использовать
Handler -> postDelayed
Handler().postDelayed({ //doSomethingHere() }, 1000)
источник
Много способов
1. Использование
Handler
классаHandler().postDelayed({ TODO("Do something") }, 2000)
2. Использование
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") }
3. Использование
Executors
классаExecutors.newSingleThreadScheduledExecutor().schedule({ TODO("Do something") }, 2, TimeUnit.SECONDS)
источник
Вам необходимо импортировать следующие две библиотеки:
import java.util.* import kotlin.concurrent.schedule
и после этого используйте его так:
Timer().schedule(10000){ //do something }
источник
Вы можете
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) }
Более того, вы можете использовать его для периодической работы. Это очень полезно. Если вы хотите выполнять задание каждую секунду, вы можете установить его параметры:
Значения TimeUnit: наносекунды, микросекунды, миллисекунды, секунды, минуты, часы, дни.
@canerkaseler
источник
Если вы используете более свежие API-интерфейсы Android, пустой конструктор Handler устарел, и вам следует включить Looper. Вы можете легко пройти через это
Looper.getMainLooper()
.Handler(Looper.getMainLooper()).postDelayed({ //Your code }, 2000) //millis
источник
Если вы находитесь во фрагменте с областью видимости viewModel, вы можете использовать сопрограммы Kotlin:
myViewModel.viewModelScope.launch { delay(2000) // DoSomething() }
источник