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
入门的门槛很低,没有那么多傻傻分不清楚的操作符- 简单的数据转换与操作符,如
map
等等 - 冷数据流,不消费则不生产数据,这一点与
LiveData
不同:LiveData
的发送端并不依赖于接收端。 - 属于
kotlin
协程的一部分,可以很好的与协程基础设施结合
关于Flow
的使用,比较简单,有兴趣的同学可参阅文档:Flow文档