Android 在Kotlin中延迟后如何调用函数?
如标题所示,在Android 在Kotlin中延迟后如何调用函数?,android,kotlin,Android,Kotlin,如标题所示,在Kotlin中是否有任何方法在延迟后(例如1秒)调用函数?您可以使用 示例(谢谢@Nguyen Minh Binh-在这里找到:) 还有一个选项可以使用Handler->postDelayed Handler().postDelayed({ //doSomethingHere() }, 1000) 一个简单的示例,显示3秒后的祝酒词: fun onBtnClick() { val handler =
Kotlin
中是否有任何方法在延迟后(例如1秒)调用函数?您可以使用
示例(谢谢@Nguyen Minh Binh-在这里找到:)
还有一个选项可以使用
Handler->postDelayed
Handler().postDelayed({
//doSomethingHere()
}, 1000)
一个简单的示例,显示3秒后的祝酒词:
fun onBtnClick() {
val handler = Handler()
handler.postDelayed({ showToast() }, 3000)
}
fun showToast(){
Toast.makeText(context, "Its toast!", Toast.LENGTH_SHORT).show()
}
您必须导入以下两个库:
import java.util.*
import kotlin.concurrent.schedule
然后,以这种方式使用它:
Timer().schedule(10000){
//do something
}
如果您正在寻找通用用法,以下是我的建议: 创建名为
Run
的类:
class Run {
companion object {
fun after(delay: Long, process: () -> Unit) {
Handler().postDelayed({
process()
}, delay)
}
}
}
然后像这样使用:
Run.after(1000, {
// print something useful etc.
})
您可以
启动
协同程序,延迟
它,然后调用函数:
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
如果您在类或对象之外,请预先设置GlobalScope
以让协同路由在其中运行,否则建议在周围的类中实现,这允许在必要时取消与该范围关联的所有协同路由。有多种方法
1.使用处理程序
类
2.使用计时器
类
3.使用执行器
类
我建议使用单线程,因为使用后不必杀死它。另外,Kotlin语言中不推荐使用“stop()”方法
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
此外,您还可以将其用于定期工作。这是非常有用的。如果希望每秒执行作业,可以设置作业的参数:
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(可运行命令,长初始延迟,长周期,时间单位)
时间单位值为:纳秒、微秒、毫秒、秒、分钟、小时、天。如果您使用的是较新的Android API,则处理程序空构造函数已被弃用,您应该包含一个循环器。您可以通过
Looper.getMainLooper()
轻松获得一个
如果您位于具有viewModel作用域的片段中,则可以使用Kotlin协程:
myViewModel.viewModelScope.launch {
delay(2000)
// DoSomething()
}
谢谢超级容易。在这里找到了一个示例
Timer(“setingup”,false)。如果添加以下两个导入:import java.util.Timer和import kotlin.concurrent,则schedule(500){doSomething()}
它会编译。schedule@MatiasEloriaga,对我来说,把这个放在一个新的品牌文件里是不会编译的,即使添加了imports定制程序,你也不需要将其放在文件中,该方法是stdlib的一部分,按照答案第一行中的链接,我原本认为即使导入kotlin.concurrent.schedule
,该程序也不会编译,因为kotlin只是抱怨签名不匹配,但后来我意识到我试图传递一个Int而不是Long。它是在修正后编译的。请补充,它只在android上可用,因为这个问题需要一个通用的kotlin方法(尽管它有android标签),从你的角度来看,它不是建设性的。因此,当用户搜索android标签时,可能会认为这是错误的答案。对于android,最好使用处理程序而不是计时器:我认为,您应该添加一个代码,以便在活动/片段完成后删除处理程序。如果您打算这样做,这将不会在UI线程上运行。请您解释一下为什么我需要编写“timerTask”而不仅仅是大括号?我想你是这样做的。Timer.schedule()
需要一个timerTask
作为第一个参数。kotlin.concurrent.timerTask()
将给定的lambda包装在TimerTask
实例中。请参见此处:另外,如果Timer
对象不会被多次使用,则给定的示例可以压缩为一行,例如,Timer().schedule(TimerTask{…},3000)
。还有一个对Kotlin更为友好的选项;请参见jonguer的回答。谢谢!奇怪的是,合作项目仅在2018年才被提及。@coolMind他们几个月后就稳定了,所以他们是全新的……是的,从10月到11月,但以前就存在过。我可以取消通话吗?您可以将其简化为分机fucntion@Ogulcan,更详细daRun.after(1000){toRun()}
。我说得对吗?您认为这里的最佳解决方案是什么?可能是第一个使用处理程序的解决方案。请参阅
/*GlobalScope.*/launch {
delay(1000)
yourFn()
}
Handler().postDelayed({
TODO("Do something")
}, 2000)
Timer().schedule(object : TimerTask() {
override fun run() {
TODO("Do something")
}
}, 2000)
// Shorter
Timer().schedule(timerTask {
TODO("Do something")
}, 2000)
// Shortest
Timer().schedule(2000) {
TODO("Do something")
}
Executors.newSingleThreadScheduledExecutor().schedule({
TODO("Do something")
}, 2, TimeUnit.SECONDS)
private fun mDoThisJob(){
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate({
//TODO: You can write your periodical job here..!
}, 1, 1, TimeUnit.SECONDS)
}
Handler(Looper.getMainLooper()).postDelayed({
//Your code
}, 2000) //millis
myViewModel.viewModelScope.launch {
delay(2000)
// DoSomething()
}