2017-06-29 167 views
2

我想弄清楚如何使用扩展函数来延迟运行任何方法,但似乎无法弄清楚。Kotlin:如何使用扩展功能延迟运行函数

我想类似下面,我有一个功能,我想处理程序通过特定的时间间隔延迟执行:

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

有人吗?

回答

5

你应该把扩展功能类型,不Unit

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

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

用法:

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

这里,::functionXreference到名为functionX全局函数。

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) 
1

另一种方法是声明一个像这样的顶级(即全局)函数:

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

然后就可以调用它,从任何地方,像这样:

withDelay(500) { functionX() } 
0

或者我喜欢这个版本太:

你想

裹任何代码块中{执行.. }

{ invokeSomeMethodHere() }.withDelay() 

而且具有调用延迟一定时间后可运行的一个扩展函数:

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

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