Answers:
您可以使用时间表
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()
期望a TimerTask
为第一个参数。kotlin.concurrent.timerTask()
将给定的lambda包装在TimerTask
实例中。看到这里:kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/…–
Timer
对象不会被多次使用(例如),则可以将给定的示例压缩为一行Timer().schedule(timerTask { ... }, 3000)
。也提供了更适合Kotlin的选项;请参阅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,因为您不必在使用后将其杀死。同样,Kotlin语言不建议使用“ stop()”方法。
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
此外,您可以将其用于定期工作。这是非常有用的。如果您想每秒进行一次工作,则可以进行设置,因为它的参数:
Executors.newSingleThreadScheduledExecutor()。scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit);
TimeUnit值是:NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS。
@canerkaseler
Timer("SettingUp", false).schedule(500) { doSomething() }