作者回复: 没错,是这个意思。
作者回复: 能从源码中找到证据,很好。
作者回复: 思想是类似的,但Flow的操作符比RxJava还是要少很多的。所以会更容易上手一些。
作者回复: 是的,Flow的学习成本会更低一些。
作者回复: 我在第17讲当中提到过,在非UI平台上,Dispatchers.Main是没有意义的。只有在Android、Swing之类的平台,我们才可以使用Dispatchers.Main。
作者回复: 是的,那么,为什么不允许多个CoroutineContext?
作者回复: 是的,Channel更像是一个底层的基础工具,不太适合直接拿来用。
作者回复: 感谢你的建议,我会考虑的。
作者回复: 其实是因为:你代码中的Dispatcher对应的线程池没有定义成守护线程。 ``` fun main() { // 请留意 Dispatcher 当中的isDaemon = true val mySingleDispatcher = Executors.newSingleThreadExecutor { Thread(it, "MySingleThread").apply { isDaemon = true } }.asCoroutineDispatcher() val scope = CoroutineScope(mySingleDispatcher) runBlocking { flow { emit(1f) emit("s") kotlinx.coroutines.delay(2000) emit(2f) emit(3f) // throw NullPointerException() emit(4f) emit(5f) logX("emit") }.filter { logX("filter") it is Float }.onStart { logX("onStart") }.onCompletion { logX("onCompletion") }.catch { logX("catch $it") }.onEach { logX(it) }.launchIn(scope) logX("end") } } ```
作者回复: 这很合理,在默认情况下,emit是会使用collect的协程上下文的。