【发布时间】:2020-04-12 05:51:53
【问题描述】:
基于这个postthrottleFirst函数:
fun <T> throttleFirst(
skipMs: Long = 700L,
scope: CoroutineScope = viewModelScope,
action: (T) -> Unit
): (T) -> Unit {
var throttleJob: Job? = null
return { param: T ->
if (throttleJob?.isCompleted != false) {
throttleJob = coroutineScope.launch {
destinationFunction(param)
delay(skipMs)
}
}
}
}
我是这样使用的:
查看
<Button
android:onClick="@{viewModel.myClickListener}"
.../>
视图模型:
fun myClickListener() = View.OnClickListener { _ ->
throttleClick(clickAction = {
//do things
})
}
BaseViewModel:
protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit {
throttleFirst(millis, scope = viewModelScope, action = clickAction)
}
但是什么也没发生,clickAction 没有到达。在调试时,当它到达return { param: T -> 时,逐步结束,并且永远不会调用返回函数(throttleJob?.isCompleted... 代码)。
我做错了什么?
编辑在Patrick的帮助下,最终的解决方案是:
视图模型
private val myThrottleClick = throttleClick(clickAction = {
//do things
})
fun myClickListener() = View.OnClickListener { myThrottleClick(Unit) }
BaseViewModel
protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit {
return throttleFirst(millis, action = clickAction)
}
【问题讨论】:
-
你在点击什么?
-
@coroutineDispatcher 帖子已更新。在来自 xml 的
Button内使用。我正在使用Data Binding -
我认为
throttleFirst(...)的返回类型是一个函数引用(lambda)。你应该在代码中的某个地方调用它。throttleFirst(..).invoke()
标签: android higher-order-functions kotlin-coroutines coroutinescope androidx-lifecycle