Kotlin Coroutines最近引入了两种Flow类型,即SharedFlow和StateFlow,Android的社区开始思考用这些新类型中的一种或两种来替代LiveData的可能性和意义。...这个决定会带来一些后果,我们将在下一节课中讨论,我们将展示使用SharedFlow和StateFlow端到端的通用性更强,可能更适合你的架构。...我们有一个操作符,用于将任何Flow转换为SharedFlow。...如果我们真的需要像使用LiveData那样用.value访问Flow的状态,我们可以使用StateFlow,它是一个专门的、受限的SharedFlow。...StateFlow对SharedFlow的约束可能不是最适合你的,你可能想用行为来调整并选择使用SharedFlow。
SharedFlow —— 高配版 LiveData 下文要讲的 StateFlow 其实是 SharedFlow 的一个子类,所以我们先讲 SharedFlow。...而 SharedFlow 容量支持配置 0 个到 多个; 背压问题: LiveData 无法应对背压问题,而 SharedFlow 有缓存空间能应对背压问题; 重放问题: LiveData 固定重放 1...个数据,而 SharedFlow 支持配置重放 0 个到多个; 线程问题: LiveData 只能在主线程订阅,而 SharedFlow 支持在任意线程(通过协程的 Dispatcher)订阅。...StateFlow —— LiveData 的替代品 StateFlow 是 SharedFlow 的子接口,可以理解为一个特殊的 SharedFlow。...5.4 普通 Flow 转换为 StateFlow 跟 SharedFlow 一样,普通 Flow 也可以转换为 StateFlow: Share.kt public fun Flow.stateIn
什么是StateFlow以及它与SharedFlow的关系。 这些热流与RxJava、Channels和LiveData的比较。 你如何在Android上使用它们。 你可能会问自己。"...Hot Flows, RxJava and LiveData 你现在知道SharedFlow和StateFlow是如何工作的了。但它们在Android上是否有用呢?...❝注意:你也可以通过lifecycle-livedata-ktx将SharedFlow和StateFlow对象转换为LiveData。...该库提供了一个扩展方法asLiveData(),允许你转换Flow并将其作为LiveData公开,以便在你的视图中使用。...更多细节,请参见Android开发者StateFlow和SharedFlow文章中的StateFlow、Flow和LiveData部分。 ❞ 所以,用更简单的术语来说。
今天的这一篇文章,我准备讲一讲StateFlow和SharedFlow的知识。...而如果谈到在Flow的所有概念当中,最最接近LiveData的,那毫无疑问就是StateFlow了。 可以说,StateFlow的基本用法甚至能够做到与LiveData完全一致。...实际上,StateFlow也有更加响应式的用法,借助stateIn函数,可以将其他的Flow转换成StateFlow。...转换成StateFlow。...到这里,StateFlow的相关内容基本就都讲完了。接下来还有今天的最后一块主题,SharedFlow。 SharedFlow 要想轻松理解SharedFlow,首先我们得要先理解粘性这个概念。
关于 Flow 的知识点有如下一些: Flow 的基本使用 StateFlow 和 SharedFlow 的使用和基本原理 StateFlow、SharedFlow 在 Android 中使用的时候和...StateFlow 顾名思义,StateFlow 就是维护状态的 Flow, 它的使用非常类似 LiveData: val state = MutableStateFlow(0)//必须要初始值...SharedFlow SharedFlow 的使用类似 StateFlow: val stream = MutableSharedFlow() // 更新 scope.launch { stream.emit...总结 初步认识上面的知识点后,我们可以利用 Flow 来改进之前的 Android 代码: UI 相关的状态我们仍然可以使用 LiveData 或者直接使用 StateFlow ,需要注意的是,状态 是一直存在的...这类逻辑如果使用 LiveData 或者 StateFlow,当页面重建后,之前的值都会被监听到,反复弹 Toast,这是一件非常麻烦的事情, 如果使用 SharedFlow ,则不会遇到。
而在Jetpack库中,SharedFlow 和 StateFlow 是两个处理数据流的利器,它们基于协程,提供了一种响应式的编程方式。本文将深入探讨这两个类的原理,以及在实际开发中的使用技巧。...原理分析 SharedFlow 和 StateFlow 基于协程构建,它们利用协程的轻量级特性,在异步操作中更加高效。...SharedFlow、StateFlow与LiveData的区别 StateFlow就是SharedFlow的一种特殊类型,特点有三: 它的replay容量为 1;即可缓存最近的一次粘性事件,如果想避免粘性事件问题...与LiveData的不同点 StateFlow必须在构建的时候传入初始值,LiveData不需要; StateFlow默认是防抖的,即相同值不更新,LiveData默认不防抖; StateFlow默认没有和生命周期绑定...简单示例 为了帮助大家更好地理解,以下是使用 SharedFlow 和 StateFlow 的简单示例: // SharedFlow 示例 val sharedFlow = MutableSharedFlow
会被挂起(emit 是个挂起函数),但这会影响到 Emitter 的速度。...,即生产者对消费者可以为一对多的关系; 都只会把最新的值给到观察者,即使没有观察者,也会更新自己的值; 都会产生粘性事件问题; 都可能产生丢失值的问题; 粘性事件问题:因为 StateFlow 初始化时必须给定初始值...2.2 与 LiveData 比较的不同点 StateFlow 必须在构建的时候传入初始值,LiveData 不需要; StateFlow 默认是防抖的,LiveData 默认不防抖; 对于 Android...与 LiveData 相比,没有和 Activity 的生命周期绑定恐怕是使用 StateFlow 最不方便的地方了。...,StateFlow和LiveData使用差异区分,SharedFlow实现源码解析; pumpkin的玄学; https://blog.csdn.net/weixin_44235109/article
StateFlow和SharedFlow这两个特殊的flow。...切换线程在flow内部不允许使用不同的ConretineContext进行emit提交数据,所以想要在内部切换线程可以通过flowOn操作符进行转换StateFlow & ShareFlowStateFlow...的时候执行这个扩展函数;但是这两个Flow不一样他们不依赖于外部调用(可配置稍后说明),他们是热流,他们发出的数据会缓存起来当有订阅者的时候再通知订阅者StateFlow 和 SharedFlow是发出状态更新并向多个使用方发出值并且可以通过...确实像,但他比LiveData更强大~~StateFlow线程切换:相比于LiveData更新数据的操作只能在主线程进行,但是Flow可以通过flowOn来在不同的Dispatchers(线程分发器,CoruntineContext...构建StateFlow &ShareFlow官方示例:将普通flow转换为ShareFlow(StateFlow的一种)通过shareIn操作符 需要传入以下三个参数:(这三个参数)class NewsRemoteDataSource
,但是生产过程中我们往往会借用这些基础的api实现我们复杂的逻辑处理,根据需求也推出了StateFlow和SharedFlow这两个特殊的flow。...切换线程 在flow内部不允许使用不同的ConretineContext进行emit提交数据,所以想要在内部切换线程可以通过flowOn操作符进行转换 StateFlow & ShareFlow StateFlow...的时候执行这个扩展函数;但是这两个Flow不一样他们不依赖于外部调用(可配置稍后说明),他们是热流,他们发出的数据会缓存起来当有订阅者的时候再通知订阅者 StateFlow 和 SharedFlow是发出状态更新并向多个使用方发出值并且可以通过...确实像,但他比LiveData更强大~~ StateFlow 线程切换:相比于LiveData更新数据的操作只能在主线程进行,但是Flow可以通过flowOn来在不同的Dispatchers(线程分发器...构建StateFlow &ShareFlow 官方示例: 将普通flow转换为ShareFlow(StateFlow的一种)通过shareIn操作符 需要传入以下三个参数: (这三个参数) class
kotlin 1.4.0正式版发布时推出了StateFlow和SharedFlow,两者拥有Channel的很多特性,可以看作是将Flow推向台前,将Channel雪藏幕后的一手重要操作。...LiveData会保证订阅者总能在值变化的时候观察到最新的值,并且每个初次订阅的观察者都会执行一次回调方法。...如果认为1还可以通过开发规范控制,SharedFlow的在无订阅者时会丢弃数据的特性则让其彻底无缘被选用承载必须被执行的事件 而StateFlow可以理解成特殊的SharedFlow,也就无论如何都会有上面两点问题...当然,适合使用SharedFlow/StateFlow的场景也有很多,下文还会重点研究。...基本等同于LiveData,区别在于StateFlow必须有初值,这也更符合页面必须有初始状态的逻辑。
这次我们就对StateFlow和SharedFlow进行深入对比: StateFlow 和 SharedFlow 概述 StateFlow: 一种用于持有单一最新状态值并发射给多个观察者的热流。...和livedata比较像,有新数据可以通知collect的一方 同时又具有flow的所有特点,比如可以挂起,切换线程 SharedFlow: 一种通用热流,可以发射事件流而不是仅限于持有最新状态。...SharedFlow的设计是为了提供一个通用的、可共享的事件流机制,支持事件的重播、缓存等。 状态持有和重播不同 StateFlow: 总是持有最新的状态值。 新的观察者会立即收到当前持有的状态值。...类型层次结构 StateFlow继承自SharedFlow,所以它是SharedFlow的一种特化实现。...(2) _sharedFlow.emit(3) 重要的API StateFlow value:获取或设置当前的状态值。
LiveData 的历史要追溯到 2017 年。彼时,观察者模式有效简化了开发,但诸如 RxJava 一类的库对新手而言有些太过复杂。...稍后我们会了解到 LiveData 还可以 启动协程 和 创建复杂的数据转换,这可能会需要花点时间。..._myUiState.value = result } } } StateFlow 是 SharedFlow 的一个比较特殊的变种,而 SharedFlow 又是 Kotlin...(newUserId) }.asLiveData() } 使用 Kotlin 数据流的实现方式非常相似,但是省下了 LiveData 的转换过程: △ 观察带参数的数据流 (StateFlow...通过 stateIn 配置对外暴露的 StateFlow 早前我们使用 stateIn 中间运算符来把普通的流转换成 StateFlow,但转换之后还需要一些配置工作。
上一篇我们初步认识了 StateFlow 和 SharedFlow ,为了有个相对更加清晰的认识,我们来看下它们的具体实现。...StateFlow 先来看看我们常用的 StateFlow(MutableStateFlow) MutableStateFlow 实际是一个包括了一个 value 的接口。...当新旧的 state 一样的时候,不会有额外处理。也就是大家常说的防抖。类似 LiveData 的 distinctUntilChanged。...SharedFlow 接着看下 SharedFlow 的实现, SharedFlow 实现比 StateFlow 复杂一点。...感兴趣的读者可以自行研究。这里 StateFlow 和 SharedFlow 的逻辑基本就理清楚了。通过一些大概的实现思路,我们可以更清楚知道两者的差异,避免一些使用过程中的困扰。
Flow.shareIn 与 Flow.stateIn 操作符可以将冷流转换为热流: 它们可以将来自上游冷数据流的信息广播给多个收集者。...它是一个使用 callbackFlow 实现的 冷流。每个新的收集者都会触发数据流的生产者代码块,同时也会将新的回调加入到 FusedLocationProviderClient。...我们要讨论的第一个话题是 shareIn 与 stateIn 之间的区别。shareIn 操作符返回的是 SharedFlow 而 stateIn 返回的是 StateFlow。...注意 : 要了解有关 StateFlow 与 SharedFlow 的更多信息,可以查看 我们的文档 。...StateFlow 是 SharedFlow 的一种特殊配置,旨在优化分享状态: 最后被发送的项目会重新发送给新的收集者,并且这些项目会使用 Any.equals 进行合并。
StateFlow与SharedFlow 问题: StateFlow和SharedFlow有哪些区别?在什么场景下应该选择使用StateFlow而不是SharedFlow,反之亦然?...出发点: 这个问题旨在考察面试者对于StateFlow和SharedFlow的区别的理解,以及在实际项目中如何根据需求选择适当的Flow。...在选择使用StateFlow还是SharedFlow时,需要考虑到是否需要在订阅者之间共享历史元素。...为了解决这个问题,可以使用stateIn操作符来创建一个StateFlow,并在需要时将其转换为SharedFlow。...结语 通过对Flow的核心概念、错误处理机制、数据转换与合并、性能优化与背压处理等方面的深度剖析,相信读者能够更好地应对Android面试中关于Flow的高级疑难问题。
它可以被反复观察,并且通常由Kotlin StateFlow、LiveData或其他类型的数据存储来支持,暴露出一个单一的值。但是我将会忽略这个流程,因为它不是本文的重点。...然而,如果你感兴趣的话,有很多文章描述了如何用StateFlow或LiveData实现UI状态。 第二个可观察流,也是本文的重点,要有趣得多。这个数据流的目的是通知视图执行一个动作,而且只有一次。...LiveData或任何conflates Kotlin flow,如StateFlow或ConflatedBroadcastChannel,都不合适。...Patrick Steiger的文章《用LiveData替代StateFlow或SharedFlow》中就有一个惊人的小插曲。(这也是一篇很好的读物)。...原文地址如下:https://proandroiddev.com/should-we-choose-kotlins-stateflow-or-sharedflow-to-substitute-for-android-s-livedata
于冷流不同,在垃圾回收之前,flow里的值都是存在内存之中,并且处于活跃状态 StateFlow StateFlow是一个状态容器式可观察数据流,可以向其收集器发出当前状态更新和新状态更新。...还可通过其value属性读取当前的状态值 和livedata比较像,有新数据可以通知collect的一方 同时又具有flow的所有特点,比如可以挂起,切换线程 SharedFlow SharedFlow...会向其中收集值得所有使用方发出数据 也就是一对多的关系,可以有多个collector 同时又具有flow的所有特点,比如可以挂起,切换线程 和上面的StateFlow不同的是,这个不能主动通知collect...方,需要不断emit元素,也就是利用了flow的功能 channel 定义概念 channel实际上是一个并发安全的队列,它可以用来连接协程,实现不同协程的通信 channel实际上就是一个队列,队列中一定存在缓冲区...produce与actor返回的channel都会随着对应的协程执行完毕而关闭 对于一个channel,如果我们调用了它的close方法,它会立即停止接受新元素,也就是说这时它的isClosedForSend
Flow 是一种基于流的编程模型,本文我们将向大家介绍响应式编程以及其在 Android 开发中的实践,您将了解到如何将生命周期、旋转及切换到后台等状态绑定到 Flow 中,并且测试它们是否能按照预期执行...您还可以在 ViewModel 中使用 androidx.lifecycle:lifecycle-livedata-ktx 包里的 Flow.asLiveData(): LiveData 将数据流转换为...LiveData,这样就可以像往常一样使用 LiveData 来实现这件事情。...△ 将任意数据流转换为 StateFlow 要将数据流转换为 StateFlow 可以使用 stateIn 运算符,它需要传入三个参数: initinalValue、scope 及 started。...SharedFlow 的更多详细信息,请参阅: StateFlow 和 SharedFlow。
这将有助于克服以下问题: 如果主线程很忙,LiveData的postValue就会丢弃。 LiveData的转换功能都是在主线程中完成的。...Connect Kotlin Coroutine to LiveData 如果我们有一个需要调用的coroutine,以获取一些数据到LiveData,我们可以做以下工作。...Connect Kotlin Flow (or StateFlow) to LiveData 以上是一次性的获取。...但如果我们有一个流程,其中数据是连续排放的,我们可以使用: val someTypeLiveData: LiveData = stateFlow.asLiveData(...Transformation on Background 正如我们之前所分享的,LiveData转换是在主线程上完成的。这使得如果转换逻辑是计算密集型的,这种转换就成了问题。
但是如果希望有多个计算结果返回回来,则可以使用 flow,flow有像Rxjava的各种操作符,实现各种功能,同时和协程一起使用,可以替代Rxjava和liveData,并且也没有像Rxjava上手这么难...,因为在订阅之前已经被消费了,所以收不到数据 热流的具体实现SharedFlow和StateFlow,分别对应的实现类MutableSharedFlow和是MutableStateFlow,所以我们要讲的也就是这两个类...具体demo如下: val stateFlow =MutableStateFlow(value = -1) lifecycleScope.launch { stateFlow.collect...,StateFlow重点在状态,只有初始值和最新值,而不会有中间值,这对于UI的状态更合适,防止重复刷新,而SharedFlow更适合事件的处理。...it.toString()) delay(1000) Log.e("conflate_end",it.toString()) } 运行结果: image.png 可以看到,对1数据也执行到结束才执行
领取专属 10元无门槛券
手把手带您无忧上云