Kotlin:如何使用扩展功能延迟运行函数

时间:2017-06-29 15:01:59

标签: android kotlin postdelayed

我正在试图弄清楚如何使用扩展函数来延迟运行任何方法,但似乎无法弄明白。

我正在尝试类似下面的地方,我有一个函数,我想要一个处理程序来延迟执行一定的timeInterval:

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 个答案:

答案 0 :(得分:5)

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

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

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

用法:

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

此处,::functionX是名为functionX的全局函数的reference

答案 1 :(得分:2)

或者我也喜欢这个版本:

在{...}

中包装您想要执行的任何代码块
{ invokeSomeMethodHere() }.withDelay()

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

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

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

答案 2 :(得分:1)

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

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

然后你可以从任何地方打电话,就像这样:

withDelay(500) { functionX() }

答案 3 :(得分: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)