作者回复: 总结到位~
作者回复: 常规业务开发其实很少会需要用到Channel,Channel的使用场景其实是比较偏底层的,比如说我在课程开头提到的IM消息通道、股票行情实时刷新,等等。
作者回复: 是的。
作者回复: viewModelScope是Android当中的内容,三言两语讲不清,我会尝试在Android篇里加入一些内容,请留意之后的第34讲的内容。
作者回复: 在Kotlin当中,我们调用cancel()以后,管道中的消息会被清空,同时,管道也会标记为cancel,这时候,我们已经可以认为它是关闭状态了。上游如果继续发送的话,会产生异常。具体可以看看下面这个代码: ``` fun main() = runBlocking { // 无限容量的管道 val channel = Channel<Int>(Channel.UNLIMITED) { println("onUndeliveredElement = $it") } // 等价这种写法 // val channel = Channel<Int>(Channel.UNLIMITED, onUndeliveredElement = { println("onUndeliveredElement = $it") }) // 放入三个数据 (1..3).forEach { channel.send(it) } // 取出一个,剩下两个 channel.receive() // 取消当前channel println(channel.isClosedForReceive) println(channel.isClosedForSend) channel.cancel() println(channel.isClosedForReceive) println(channel.isClosedForSend) channel.send(4) } ```
作者回复: 没错,所以多个Channel组合的情况,我们需要三思而后行。
作者回复: 原因就是:到目前为止isClosedForReceive是ExperimentalCoroutinesApi,它的功能仍然是有缺陷的。当Channel有capacity 以后,Kotlin官方支持的并不好,所以我们暂时不应该用它。
作者回复: 你说的produce{}吗?在它的Lambda当中,我们是可以调用send()方法的,而它的返回值是ReceiveChannel。这不是一个概念哈。
作者回复: Channel的接口本身是通过组合得来的,理论上我们是可以让它们互换的,但不建议这么干。
作者回复: 这是Kotlin 命名的一种特色。