channel相当于管道,协程间通信用。测试下:
Kotlin
private fun tsetChannel() {
lifecycleScope.launch {
val channel = Channel<Int>()
launch {
for (i in 1..5) {
Log.d("zxzx", "开始发送数据:$i")
channel.send(i)
}
channel.close()
}
for (i in channel) {
Log.d("zxzx", "接收到数据:$i")
}
// Log.d("zxzx", "receive: ${channel.receive()}") // 抛异常: Channel was closed
}
Log.d("zxzx", "东风不与周郎便,铜雀春深锁二乔。")
}
运行,打印:

ok. 一个协程在发数据,另一个协程接受到数据。
再测试下:
Kotlin
fun testProduceAndConsume() {
GlobalScope.launch {
val channel = Channel<Int>()
val producer = GlobalScope.launch(Dispatchers.IO) {
var i = 0
while (true) {
if (channel.isClosedForReceive) {
Log.d("zxzx", "channel已关闭")
break
}
Log.d("zxzx", "生产者生产了:$i")
channel.send(i++)
delay(1000)
}
}
val consumer = GlobalScope.launch {
while (true) {
val element = channel.receive() // 没数据时会挂起等待数据
Log.d("zxzx", "消费者消费了: $element")
if (element == 10) {
channel.close()
break
}
}
}
producer.join()
consumer.join()
Log.d("zxzx", "所有任务完成")
}
}
打印:

ok .