Kotlin:如何使用扩展函数延迟运行一个函数

4
我正在尝试使用扩展函数来延迟运行任何方法,但似乎无法弄清楚。
我尝试以下代码,其中我有一个函数,并且希望处理程序将执行延迟一段时间:
functionX().withDelay(500)
functionY().withDelay(500)

private fun Unit.withDelay(delay: Int) {
  Handler().postDelayed( {this} , delay)}

private fun Handler.postDelayed(function: () -> Any, delay: Int) {
  this.postDelayed(function, delay)}

有人吗?

4个回答

7
另一种方法是声明一个顶级(即全局)函数,如下所示:

fun withDelay(delay : Long, block : () -> Unit) {
    Handler().postDelayed(Runnable(block), delay)
}

然后,您可以从任何地方调用它,如下所示:
withDelay(500) { functionX() }

我们如何在延迟时间之间随时取消来完成这个任务呢? - Jaydip Umaretiya

6

您应该将扩展名放在函数类型上,而不是 Unit 上:

fun functionX() {}
fun functionY() {}

private fun (() -> Any).withDelay(delay: Int) {
     Handler().postDelayed(this , delay)
}

使用方法:

::functionX.withDelay(500)
::functionY.withDelay(500)

在这里,::functionX是对名为functionX的全局函数的引用


2
我喜欢这个版本:
在 { ... } 中包装您想要执行的任何代码块。
{ invokeSomeMethodHere() }.withDelay()

并且具有一个扩展函数,可以在一定延迟后调用Runnable:

fun <R> (() -> R).withDelay(delay: Long = 250L) {

    Handler().postDelayed({ this.invoke() }, delay)
}

感谢分享! - Wahib Ul Haq
1
然而,它有一个问题,我今天发现了。如果你在回调函数中使用它,除非在前面的语句中添加 ;,否则它不起作用,因为它将前一行视为被调用表达式的一部分。 - Wahib Ul Haq

0
例如,您可以像这样声明全局变量:

private var handler: Handler = Handler()
private lateinit var runnableNewUrlBackground: Runnable

并将该函数声明为全局的

init {
    runnableNewUrlBackground = Runnable {
        // Your function code here
        myCustomFun();
    }
}

然后,当你想要调用它时,只需使用:

handler.postDelayed(runnableNewUrlBackground, YOUR_DESIRED_TIME)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接