作为标题,在Kotlin中是否有方法在延迟(例如1秒)后调用函数?


当前回答

很多方面

1. 使用Handler类

Handler().postDelayed({
    TODO("Do something")
    }, 2000)

2. 使用Timer类

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")
}

3.使用Executors类

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)

其他回答

很多方面

1. 使用Handler类

Handler().postDelayed({
    TODO("Do something")
    }, 2000)

2. 使用Timer类

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")
}

3.使用Executors类

Executors.newSingleThreadScheduledExecutor().schedule({
    TODO("Do something")
}, 2, TimeUnit.SECONDS)

如果你正在使用最新的Android api, Handler空构造函数已经被弃用,你应该包括一个循环程序。你可以很容易地通过loop . getmainlooper()得到一个。

    Handler(Looper.getMainLooper()).postDelayed({
        //Your code
    }, 2000) //millis

你可以启动一个协程,延迟它,然后调用函数:

 /*GlobalScope.*/launch {
   delay(1000)
   yourFn()
 }

如果你在类或对象的外部,让协程在那里运行,否则建议在周围的类中实现CoroutineScope,这允许在必要时取消与该作用域关联的所有协程。

如果你在寻找通用用法,下面是我的建议:

创建一个名为Run的类:

class Run {
    companion object {
        fun after(delay: Long, process: () -> Unit) {
            Handler().postDelayed({
                process()
            }, delay)
        }
    }
}

像这样使用:

Run.after(1000, {
    // print something useful etc.
})

另一种创造冗余工作的方法;这并不要求函数挂起。

   val repeatableJob = CoroutineScope(Dispatchers.IO).launch {
        while (true) {
            delay(1000)
        }
    }

完成后取消- repeatableJob.cancel ()