[英]Coroutine doens't start?
基於此后throttleFirst
函數:
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
})
}
基礎視圖模型:
protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit {
throttleFirst(millis, scope = viewModelScope, action = clickAction)
}
但是沒有任何反應,沒有達到clickAction 。 在調試時,當它點擊return { param: T ->
並且永遠不會調用返回函數( throttleJob?.isCompleted
...代碼)時,逐步結束。
我究竟做錯了什么?
在帕特里克的幫助下編輯最終解決方案是:
視圖模型
private val myThrottleClick = throttleClick(clickAction = {
//do things
})
fun myClickListener() = View.OnClickListener { myThrottleClick(Unit) }
基礎視圖模型
protected fun throttleClick(millis: Long = 700L, clickAction: (Unit) -> Unit): (Unit) -> Unit {
return throttleFirst(millis, action = clickAction)
}
您的throttleFirst
函數創建一個點擊偵聽器,因此您必須將其存儲在點擊偵聽器范圍之外的val 中。 IE
val clickListener = throttleFirst { doStuff() }
fun myClickListener() = View.OnClickListener { _ -> clickListener() }
您可以完全myClickListener
函數,而只在 xml 中引用clickListener
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.