在Kotlin中对用户输入进行去抖动

在Kotlin中对用户输入进行去抖动,kotlin,coroutine,debounce,Kotlin,Coroutine,Debounce,假设我接收到触发方法调用的用户输入(或触发此方法调用的任何其他事件),需要进行备份调用或在DB中保存某些内容,但用户输入非常快,我对所有输入都不感兴趣,例如,我需要对此快速输入执行去盎司操作。我使用合并频道解决了这个问题,下面是一个小演示,展示了我的解决方案: class Coroutines { val chanel = Channel<String>(Channel.CONFLATED) val scope = CoroutineScope(Dispatcher

假设我接收到触发方法调用的用户输入(或触发此方法调用的任何其他事件),需要进行备份调用或在DB中保存某些内容,但用户输入非常快,我对所有输入都不感兴趣,例如,我需要对此快速输入执行去盎司操作。我使用合并频道解决了这个问题,下面是一个小演示,展示了我的解决方案:

class Coroutines {

    val chanel = Channel<String>(Channel.CONFLATED)
    val scope = CoroutineScope(Dispatchers.IO)

    fun run() {
        val input = Scanner(System.`in`)

        scope.launch {
            listen()
        }

        var inputStr = ""
        while (inputStr != "q") {
            inputStr = input.nextLine()
            println("Input is $inputStr")

            scope.launch {
                chanel.send(inputStr)
            }
        }
    }
    
    private suspend fun listen() {
        while (true) {
            val msg = chanel.receive()
            println("Received $msg")
            delay(3000)
        }
    }
}
类协同程序{
val chanel=通道(通道合并)
val scope=CoroutineScope(Dispatchers.IO)
趣味跑(){
val输入=扫描仪(系统中的'in`)
范围.发射{
听
}
var inputStr=“”
while(inputStr!=“q”){
inputStr=input.nextLine()
println(“输入为$inputStr”)
范围.发射{
chanel.send(输入str)
}
}
}
二等兵{
while(true){
val msg=chanel.receive()
println(“收到$msg”)
延迟(3000)
}
}
}

我觉得必须有一个更好的解决方案来解决这个问题,也许是使用协程流?有什么建议吗?

如果要取消对用户的影响,请单击“输入”,然后执行类似操作

   const val CLICK_DEBOUNCE = 300L

/**
 * click flow
 */
fun View.asClick(): Flow<Unit> = callbackFlow {
    this@asClick.setOnClickListener {
        this.offer(Unit)
    }
    awaitClose { this@asClick.setOnClickListener(null) }
}
lifecycleScope.launch {
        binding.btnSaveFile.asClick().debounce(CLICK_DEBOUNCE).collect {
            //do something
        }
    }

这回答了你的问题吗--我建议看看我的答案,因为被接受的答案使用了一个协同程序,这就像把一个大锤带到钉子上一样。