Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Kotlin中延迟后如何调用函数?_Android_Kotlin - Fatal编程技术网

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,更详细da
Run.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()
    }