写点什么

官方推荐 Flow,LiveData:那我走,绝对干货

用户头像
Android架构
关注
发布于: 23 小时前

LiveData


========


LiveData 在 2017 年推出以来,作为 Jetpack 大家族的元老级人物,为安卓的 MVVM 架构作出了非凡的贡献,毕竟在当时的背景环境,大家都深陷 RxJava 的支配。而 LiveData 作为观察者模式的框架,能够以更平滑的学习曲线来实现变量的订阅,比起 RxJava 那一套更加轻量级,而且作为 Google 的亲儿子,在生命周期的管理上也有更出色的表现。



LiveData 的缺点:




而 LiveData 它的缺点其实也非常明显,LiveData 肩负着为 UI 提供数据订阅的能力,所以他的数据订阅只能在主线程,可能会有小伙伴说可以在子线程通过 postValue 去发布数据啊。但是其实这个 postValue 是有坑的,被坑过的小伙伴都应该知道短时间通过多次 postValue,中间可能会存在数据的丢失。


而且在复杂的场景 LiveData 支持的能力确实有一些尴尬。


总结一下 LiveDta 有几个缺点:


  • 在异步线程修改数据可能存在数据丢失的问题

  • 在复杂的场景,LiveData 的能力有一些捉襟见肘


LiveData 你别走




但我们也不应该踩一捧一,确实 LiveData 整体上有更低的学习成本,在一些简单的场景 LiveData 已经完全能够满足我们的需要。


而且官方也说过并不会废弃 LiveData,原因是:


  • 用 Java 写 Android 的人还需要它,因为 Flow 是协程的东西,所以如果你是用 Java 的,是没有办法使用 Flow 的,所以 LiveData 还是有意义的。

  • LiveData 的使用比较简单,而且功能上对于简单场景也是足够的,而 RxJava 和 Flow 这种东西学起来就没 LiveData 那么直观。


Flow


====


Flow 是 Google 官方提供的一个类似于 RxJava 的响应式编程模型。它是基于 Kotlin 协程的。 它相对于 Rxjava 具有以下特点:


  • 具有更友好的 API,学习成本较低

  • 跟 Kotlin 协程、LiveData 结合更紧密,Flow 能够转换成 LiveData,在 ViewModel 中直接使用

  • 结合协程的作用域,当协程被取消时,Flow 也会被取消,避免内存泄漏


我们知道 Flow 的特点之一就是冷流。那么什么是冷流呢?


  • 冷流:当数据被订阅的时候,发布者才开始执行发射数据流的代码。并且当有多个订阅者的时候,每一个订阅者何发布者都是一对一的关系,每个订阅者都会收到发布者完整的数据。

  • 热流:无论有没有订阅者订阅,事件始终都会发生。当热流有多个订阅者时,发布者跟订阅者是一对多的关系,热流可以与多个订阅者共享信息。


StateFlow




因为 Flow 是冷流,这与 LiveData 的特点完全不一样,因此 Flow 提供了 StateFlow 来实现热流。


[StateFlow](


) 是 [**Share


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


dFlow**](


) 的一个比较特殊的变种,而 SharedFlow 又是 Kotlin 数据流当中比较特殊的一种类型。StateFlow 与 LiveData 是最接近的,因为:


  • 它始终是有值的。

  • 它的值是唯一的。

  • 它允许被多个观察者共用 (因此是共享的数据流)。

  • 它永远只会把最新的值重现给订阅者,这与活跃观察者的数量是无关的。


官方推荐当暴露 UI 的状态给视图时,应该使用 StateFlow。这是一种安全和高效的观察者,专门用于容纳 UI 状态。

StateFlow 使用

StateFlow 替换掉 LiveData 是简单的。我们来看看 StateFlow 的构造函数:


/**


  • Creates a [MutableStateFlow] with the given initial [value].


*/


@Suppress("FunctionName")


public fun <T> MutableStateFlow(value: T): MutableStateFlow<T> = StateFlowImpl(value ?: NULL)



我们在ViewModel上游中不断的发送值,View层通过collect函数去获取到上游发送的数据。


StateFlow只有在值发生改变时才会返回,如果发生更新但值没有变化时,StateFlow不会回调collect函数,但LiveData会进行回调。

stateIn

StateIn 能够将普通的流转换为 StateFlow,但转换之后还需要一些配置工作.



  • scope 共享开始时所在的协程作用域范围

  • started 控制共享的开始和结束的策略

  • Lazily: 当首个订阅者出现时开始,在?scope?指定的作用域被结束时终止。

  • Eagerly: 立即开始,而在?scope?指定的作用域被结束时终止。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
官方推荐Flow,LiveData:那我走,绝对干货