前言
打开Android架构组件页面,我们可以发现一些最新发布的jetpack
组件,如Room
,DataStore
, Paging3
,DataBinding
等都支持了Flow
Google开发者
账号最近也发布了几篇使用Flow
的文章,比如:从 LiveData 迁移到 Kotlin 数据流
看起来官方在大力推荐使用Flow
取代LiveData
,那么问题来了,有必要吗?
我LiveData
用得好好的,有必要再学Flow
吗?本文主要回答这个问题,具体包括以下内容
1.LiveData
有什么不足?
2.Flow
介绍以及为什么会有Flow
3.SharedFlow
与StateFlow
的介绍与它们之间的区别
本文具体目录如下所示:
1. LiveData
有什么不足?
1.1 为什么引入LiveData
?
要了解LiveData
的不足,我们先了解下LiveData
为什么被引入
LiveData
的历史要追溯到 2017 年。彼时,观察者模式有效简化了开发,但诸如RxJava
一类的库对新手而言有些太过复杂。为此,架构组件团队打造了LiveData
: 一个专用于Android
的具备自主生命周期感知能力的可观察的数据存储器类。LiveData
被有意简化设计,这使得开发者很容易上手;而对于较为复杂的交互数据流场景,建议您使用RxJava
,这样两者结合的优势就发挥出来了
可以看出,LiveData
就是一个简单易用的,具备感知生命周期能力的观察者模式
它使用起来非常简单,这是它的优点,也是它的不足,因为它面对比较复杂的交互数据流场景时,处理起来比较麻烦
1.2 LiveData
的不足
我们上文说过LiveData
结构简单,但是不够强大,它有以下不足
1.LiveData
只能在主线程更新数据
2.LiveData
的操作符不够强大,在处理复杂数据流时有些捉襟见肘
关于LiveData
只能在主线程更新数据,有的同学可能要问,不是有postValue
吗?其实postValue
也是需要切换到到主线程的,如下图所示:
这意味着当我们想要更新LiveData
对象时,我们会经常更改线程(工作线程→主线程),如果在修改LiveData
后又要切换回到工作线程那就更麻烦了,同时postValue
可能会有丢数据的问题。
2. Flow
介绍
Flow
就是 Kotlin
协程与响应式编程模型结合的产物,你会发现它与 RxJava
非常像,二者之间也有相互转换的 API
,使用起来非常方便。
2.1 为什么引入Flow
为什么引入Flow
,我们可以从Flow
解决了什么问题的角度切入
LiveData
不支持线程切换,所有数据转换都将在主线程上完成,有时需要频繁更改线程,面对复杂数据流时处理起来比较麻烦- 而
RxJava
又有些过于麻烦了,有许多让人傻傻分不清的操作符,入门门槛较高,同时需要自己处理生命周期,在生命周期结束时取消订阅
可以看出,Flow
是介于LiveData
与RxJava
之间的一个解决方案,它有以下特点
Flow
支持线程切换、背压Flow
入门的门槛很低,没有那么多傻傻