为何示例二中的collect函数会无限挂起,与示例一不同?
为什么示例二的collect会无限挂起?
示例一的Flow特性
示例一中的Flow是通过flow { ... }创建的有限冷流:
- 它仅在被collect时才启动执行代码块,循环1到10依次发送元素
- 当所有元素都
emit完成后,这个Flow会主动触发完成信号,collect函数接收到该信号后就会正常退出,后续的Log.w("ABC", "2")代码也能顺利执行
示例二的DataStore Flow特性
示例二中的dataStore.data是一个无限热流:
- 它的设计目的是持续监听Preferences的变化,执行时会先发送当前存储的最新值
- 发送初始值后,它不会主动结束,而是一直处于等待状态,随时准备在Preferences发生修改时发送新值
- 因此collect会一直挂起在这个Flow上,永远无法收到完成信号,导致后续的
Log.w("ABC", "2")永远得不到执行的机会
内容的提问来源于stack exchange,提问作者Taha Sami
相关产品推荐
相关产品推荐

