首先是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的動作
}
}
}