簡體   English   中英

協程沒有啟動?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM