Flow调用.take(2)的作用及Room数据库Flow场景的行为确认
Room Flow 行为疑问解答
疑问1:Code A会持续运行,数据库变化时todo(it)反复执行,是否正确?
正确。
Room返回的Flow是可观察的冷数据流,调用collect时才会触发初始查询并开始监听数据变化:
- 首次
collect会立即发射当前数据库的查询结果,执行一次todo(it); - 之后只要对应数据发生增/删/改,Flow就会自动发射最新查询结果,
todo(it)会再次执行; - 除非
collect所在协程被取消(比如页面销毁、协程作用域结束),否则监听会一直持续,todo(it)会随数据变化反复执行。
疑问2:Code B中todo(it)仅被调用两次后操作取消,是否正确?
正确。take(2)是Flow的操作符,作用是仅接收流发射的前2个事件,接收完第2个事件后会自动取消流订阅:
- 第一次发射:数据库初始查询结果,执行
todo(it); - 第二次发射:数据库数据变更后的最新结果,再次执行
todo(it); - 接收完这两次后,
take(2)终止整个流,collect结束,后续数据库再变化也不会触发todo(it),因为已经取消了对Room的监听。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

