【问题标题】:How to poll item in Channel Kotlin如何在 Channel Kotlin 中轮询项目
【发布时间】:2023-02-09 02:35:17
【问题描述】:

我正在踩Channel缓冲.我正在学习轮询项目通过Channel。当我发送项目时,它不会receive()所有项目。我不明白为什么?

class QueueViewModel(private val application: Application) : AndroidViewModel(application) {

    val basketChannel = Channel<String>(Channel.UNLIMITED)
    
    init {
        startPolling()
    }

 
    fun addItems() {
        addItemInChannel(100L, "Item 1")
        addItemInChannel(1000L, "Item 2")
        addItemInChannel(400L, "Item 3")
        addItemInChannel(500L, "Item 4")
    }

    fun addItemInChannel(delay: Long, item: String) {
        viewModelScope.launch {
            delay(delay)
            logE("basketChannelItem added -> $item")
            basketChannel.send(item)
        }
    }

    fun startPolling() {
        viewModelScope.launch {
            Log.e(TAG, "Starting Polling")
            for (element in basketChannel) {
                logE("basketChannel Item poll -> $element")
                basketChannel.receive()
            }
        }
    }
}

我在活动中打电话给addItems()..

输出

其他物品哪里去了?

【问题讨论】:

    标签: android kotlin kotlin-coroutines android-viewmodel


    【解决方案1】:

    这是因为您在两个地方获取您频道的项目:forreceive()。通常,它们的工作方式相同。根据你的日志,for收到项目14,而receive()方法收到23

    您可以删除basketChannel.receive()行,您将收到for循环中的所有元素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2013-10-30
      • 2021-02-01
      • 2020-01-11
      相关资源
      最近更新 更多