LiveData和StateFlow的差别
之前写过LiveData的内部实现LiveData,Jetpack中还有另一个组件StateFlow,两者作用非常类似,有什么差别呢?
StateFlow、Flow 和 LiveData StateFlow 和 LiveData 具有相似之处。两者都是可观察的数据容器类,并且在应用架构中使用时,两者都遵循相似模式。
但请注意,StateFlow 和 LiveData 的行为确实有所不同:
StateFlow 需要将初始状态传递给构造函数,而 LiveData 不需要。 当 View 进入 STOPPED 状态时,LiveData.observe() 会自动取消注册使用方,而从 StateFlow 或任何其他数据流收集数据的操作并不会自动停止。如需实现相同的行为,您需要从 Lifecycle.repeatOnLifecycle 块收集数据流。
这是Android Developer-StateFlow 和 SharedFlow中写到的。
的确LiveData构造方法中可以不传递值,为什么这么设计呢?我认为两者设计的用途是不同的。
LiveData的不管是从名字还是实现上,真的很像是一个Data,内部有value,有版本,会让新增加的观察者保持最新的状态,也就是粘性事件(非要叫什么"数据倒灌"好显得高级- -)。一般会用需要传入LifeCycleOwn的方法注册观察者,因此生命周期是和LifeCycle绑定的,所以是live的。
LiveData更新值时是需要在主线程执行的,上面的考虑在一起,它就是用来保持UI和一个数据的状态(粘性事件,最好不要执行逻辑)是同步的,因此是实现MVVM架构的一个关键部分。
一个Data没有初始值,也很合理。
那StateFlow呢?StateFlow首先是一个flow,在Kotlin中Flow最基本的作用是发送数据,StateFlow还是一个热流(观察者中只能收集到订阅之后的数据变化),不像冷流能接收到从最开始发送的数据。且是和生命周期没有关联的,有了协程的加持,使用的范围可以更大些,可以从其他子线程收集到之后发给任意线程,而不是仅限于主线程。
State能没有初始值吗,听起来不太合适。
StateFlow能替换LiveData吗?我认为的是可以的。
LiveData两大特点分别是和生命周期绑定、粘性事件。生命周期StateFlow借助扩展函数repeatOnLifecycle可以做到,粘性事件也是本身就支持的。
但是,LiveData不需要借助协程,开箱即用,有更具体的使用场景。