kotlin Channel Flow 遇到的問題

首先是channel 如果 channel 調用過一次 receive 那麼再用for循環去拿到的就會少一個,每次調用receive 是從阻塞隊列中取一個,取了隊列中就沒了

val markerchannel = Channel<Marker>()
            launch {
                //發送樓盤描述
                for (i in 0..(dragPositionDesArray.size() - 1)) {
                    val marker = dragPositionDesArray[i]
                    if(marker != null){
                        markerchannel.send(marker)
                }
               
                //關閉channel
                markerchannel.close()
            }
markerchannel.receive()

在用flow 發送百度地圖截屏後的結果的時候 flow.collect死活拿不到,同樣的邏輯 channnel 就沒事,

val channel = Channel<Bitmap>()
            mBaiduMap.snapshot { bitmap ->
                launch {
                    channel.send(bitmap)
                    channel.close()
                }

            }

val mapFlow = flow {
mBaiduMap.snapshot { bitmap ->
                launch {
                    omit(bitmap )
                }

            }
}

launch {
     mapFlow.collect
}
            

最後發現是需要再 runBlocking 中執行 flow.collect 才能拿到結果, 爲了防止 runBlocking 阻塞主線程,最好還是 runBlocking(Dispatchers.IO) ,在io線程去拿結果,最後再到主線程執行更新UI

runBlocking<Unit>(Dispatchers.IO) {
		x().collect { item ->
            launch(Dispatchers.Main) {
     			更新UI的動作
			}
        }
        
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章