配合ViewModel的数据观察组件| 青训营笔记

119 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第34天 在小组的具体合作中,主要的讨论是关于Livedata和Flow的使用。

这里存在一个前提——本小组的大作业使用全kotlin编写。这是具有一定影响的考虑因素。

为了对Livedata和Flow有更深的理解,方便技术选型。故撰写本篇对比研究两者笔记。

为确保准确性。本文大部分资料来自Android官方的developer文档。

LiveData解析

根据Google官方介绍。LiveData是一种可观察的数据存储器类。是Android Jetpack(官方优秀组件集合)的一部分。

对于可观察性,这点可以结合观察者模式进行思考。LiveData 遵循观察者模式,并因此获得了自动更新界面的优点。

不过,LiveData最大的特别点在于,它具有生命周期感知能力——能够感知其他应用组件(如 activity、fragment 或 service)的生命周期,并根据这点改变自己的行为。如仅仅更新处于活跃生命周期状态的应用组件观察者。

这当然有利于程序性能的提升;防止内存泄漏问题的出现;不会因 Activity 停止而导致崩溃(非活跃状态观察者不会接收任何 LiveData 事件);自动管理生命周期问题,数据始终保持最新状态;配置更改(如设备旋转)时会立即接收最新的可用数据;共享资源同时添加多个观察者。

为了使用LiveData,需要使用实现了LifecycleOwner接口的观察者。这点应用组件基本都满足。

在kotlin中,特有的协程可以与LiveData共同工作

Flow解析

根据官方文档介绍:在协程中,Flow可按顺序发出多个值。Flow是可通过异步方式进行计算处理的一组数据序列。所发出值的类型必须相同。

它使用挂起函数通过异步方式生成和使用值。例如,Flow可安全地发出网络请求以生成下一个值,而不会阻塞主线程。

developer图:

image.png

在Flow的传递中,中途允许进行某种程度上的修改。并且全程可以进行在异步之下

这是Flow相对LiveData的重大改进——后者进行PostValue时需要切换到到主线程进行。因此更新或转换数据时,往往需要从工作线程切换到主线程,无法全程处于异步之中。

此外LiveData作为早期的Android观察数据组件,本身操作符还不够强大,面对比较复杂的场景时,处理较麻烦。

Flow作为在LiveData基础上创造的新组件。不仅能够支持线程切换,同时入门简单,数据转换与操作符简单,属于kotlin协程的一部分能够很好集合。

此外,Flow还可以处理冷数据流和热数据流的问题。冷流具有更好的性能,热流更能完成一对多的场景。

在热流中,StateFlow与LiveData类似,能够很好地替换后者。它的特点是始终有值(需要初始值),确保空安全;值唯一;热流;自动更新。

综合以上两者的优缺点考虑,结合本组使用kotlin,同时小组成员对于LiveData和Flow熟练程度相差不大的情况。最终,本小组选用了Flow作为数据观察组件。

\