Kotlin中Room返回的Flow的collect操作会随数据变更重执行吗?
问题解答
当info_table中的记录发生变更时,listIncompleted().collect{..}里的代码块会重新执行,而非仅执行一次。
原因说明
Room 对返回Flow类型的@Query方法做了内置的监听逻辑:
- 当你调用
collect启动协程后,Room会持续监听该查询对应的数据集(也就是info_table中满足translateState != COMPLETED的记录)。 - 只要数据库中任何操作导致这个数据集发生变化(比如新增符合条件的记录、修改某条记录的
translateState使其进入/退出该数据集、删除符合条件的记录),Room就会自动重新执行查询,将更新后的List<RecordEntity>发射给Flow,进而触发collect内的代码块再次执行。
额外注意
只要serviceScope对应的协程处于活跃状态(比如你的MyService还在运行且协程未被取消),这个监听就会一直持续。如果Service被销毁或协程被取消,监听才会停止,collect的代码块也不会再被触发。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

