相信最开始我们接触的都是冷流,常见的一种创建方式:
// cold flow
flow{
emit(...)
}
这段代码只有在配合终端符(collect/toList/Single等)出现时才会被执行。
紧接着了解到热流:ShareFlow,StateFlow
热流不需要有终端符的参与就可独立执行。
那么现在的问题是:它们的应用场景是什么?
- StateFlow: 可以用来替换LiveData。LiveData有粘滞效应,也就是当LiveData发出数据之后,有新的observer来观察时,LiveData会将最后一次(也就是最新的)数据发送给observer. 但但但是,LiveData是有生命周期感知的,用StateFlow在collect数据时,需要将其放入repeatLifeCycle(onStart)中,以此避免activty/fragment都不存在了,可能collect还在处理数据的问题,有可能引发crash。
- ShareFlow:从老外给的命名上来看,是用来共享数据的流。那为什么要共享呢?小明共享了小花的答案,第一,小明有需求;第二,小明不用自己来算。对应到项目中来说就是有这样的需求,有多个collect需要收集同一个flow的数据,flow的数据经过一次计算后,可以被多个collect收集。而冷流呢?显然不是这样。
- 冷流的触发条件是使用终端符去接收flow,那如果像热流那样有多个collect去接收冷流呢?每个collect会收集到数据吗?答案是肯定的。两种方式的区别在哪里?对于冷流,有几个收集者,flow里的代码就要执行多少遍,显然在有些情况下,我们是不需要这样的特性的。而热流呢?在配置replay=1 的情况下,仅会将最后一次的结果发送给新出现的收集者。