【问题标题】:Coroutine that waits for input with timeout等待超时输入的协程
【发布时间】:2020-02-23 21:34:30
【问题描述】:

我是协程的新手,我正在尝试了解是否/如何利用它们来执行以下操作:

  1. 开始监听事件(例如,键盘输入)
  2. 如果有事件到来,就对其做出反应(做某事)
  3. 如果在 n 秒内没有事件到达,则执行其他操作

我在想我可能需要将超时设置为事件本身。但是我很难理解这些东西。执行上述操作的简单示例将非常有启发性。

【问题讨论】:

    标签: kotlin jvm coroutine kotlin-coroutines


    【解决方案1】:

    您可以使用Kotlin' own timeout functionality

    val result = withTimeoutOrNull(timeoutInMillis) {
        var event = getKeybouardEvent()
        while(event == null) {
            event = getKeybouardEvent()
         }
        return event
    }
    if(result == null) doThis() else doThat()
    

    【讨论】:

    • 接受,因为它回答了基本问题。现在,我想继续处理事件而不是只处理一次。我可以把它放在do { ...} while (result != null) 循环中,但这是要走的路吗?它会在处理完每个事件后启动一个新的协程,因此不确定那里是否没有不必要的开销。
    • 另外,getKeyboardEvent 在这种情况下会是一个挂起函数,对吧?
    • 实际上,如果是这样的话,内部while 循环就没有必要了。当你举这个例子时,你脑子里有没有忙着投票?
    • 回答我自己上面的第一条评论:根据kotlinlang.org/docs/reference/coroutines/…,协程似乎足够轻量级,可以启动很多
    • @herman 1) 正如您自己发现的那样,启动协程是免费的午餐。 2)你有几种重启这个计时器的可能性,比如:do/while,另一个将事件发送到通道的协程:kotlinlang.org/docs/reference/coroutines/channels.html
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 2016-07-30
    • 1970-01-01
    • 2021-12-04
    • 2015-03-27
    • 2018-05-16
    • 1970-01-01
    • 2017-02-24
    相关资源
    最近更新 更多