【发布时间】:2020-07-10 18:15:01
【问题描述】:
假设我收到触发方法调用的用户输入(或任何其他事件触发此方法调用),需要进行支持调用或在数据库中保存某些内容,但用户输入非常快,我不感兴趣所有输入,例如我需要对这个快速输入进行去抖动操作。我能够使用混合通道解决问题,下面是一个展示我的解决方案的小演示:
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)
}
}
}
我觉得这个问题一定有更好的解决方案,也许是使用 Coroutines Flow 的东西?有什么建议吗?
【问题讨论】:
-
这能回答你的问题吗? How can I debounce a setOnClickListener for 1 second using Kotlin Coroutines? -- 我建议查看我的答案,因为接受的答案使用协程,这就像用大锤敲钉子一样。