【问题标题】:Debounce user input in Kotlin [duplicate]在 Kotlin 中消除用户输入的抖动 [重复]
【发布时间】: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 的东西?有什么建议吗?

【问题讨论】:

标签: kotlin coroutine debounce


【解决方案1】:

如果您想消除用户点击输入的抖动,请执行以下操作。

   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
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多