首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有小伙伴说看不懂 LiveData、Flow、Channel,跟我走

SharedFlow —— 高配版 LiveData 下文要讲 StateFlow 其实是 SharedFlow 一个子类,所以我们先讲 SharedFlow。...而 SharedFlow 容量支持配置 0 个 多个; 背压问题: LiveData 无法应对背压问题,而 SharedFlow 有缓存空间能应对背压问题; 重放问题: LiveData 固定重放 1...个数据,而 SharedFlow 支持配置重放 0 个多个; 线程问题: LiveData 只能在主线程订阅,而 SharedFlow 支持在任意线程(通过协程 Dispatcher)订阅。...StateFlow —— LiveData 替代品 StateFlowSharedFlow 子接口,可以理解为一个特殊 SharedFlow。...5.4 普通 Flow 转换StateFlowSharedFlow 一样,普通 Flow 也可以转换StateFlow: Share.kt public fun Flow.stateIn

2.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

了解 Kotlin Flow(一)

关于 Flow 知识点有如下一些: Flow 基本使用 StateFlowSharedFlow 使用和基本原理 StateFlowSharedFlow 在 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 ,则不会遇到。

97410

SharedFlow vs StateFlow,一篇看懂选择和使用技巧

而在Jetpack库中,SharedFlowStateFlow 是两个处理数据流利器,它们基于协程,提供了一种响应式编程方式。本文将深入探讨这两个类原理,以及在实际开发中使用技巧。...原理分析 SharedFlowStateFlow 基于协程构建,它们利用协程轻量级特性,在异步操作中更加高效。...SharedFlowStateFlowLiveData区别 StateFlow就是SharedFlow一种特殊类型,特点有三: 它replay容量为 1;即可缓存最近一次粘性事件,如果想避免粘性事件问题...与LiveData不同点 StateFlow必须在构建时候传入初始值,LiveData不需要; StateFlow默认是防抖,即相同值不更新,LiveData默认不防抖; StateFlow默认没有和生命周期绑定...简单示例 为了帮助大家更好地理解,以下是使用 SharedFlowStateFlow 简单示例: // SharedFlow 示例 val sharedFlow = MutableSharedFlow

89110

Kotlin 学习笔记(六)—— Flow 数据流学习实践指北(二)StateFlowSharedFlow

会被挂起(emit 是个挂起函数),但这会影响 Emitter 速度。...,即生产者对消费者可以为一对多关系; 都只会把最新值给观察者,即使没有观察者,也会更新自己值; 都会产生粘性事件问题; 都可能产生丢失值问题; 粘性事件问题:因为 StateFlow 初始化时必须给定初始值...2.2 与 LiveData 比较不同点 StateFlow 必须在构建时候传入初始值,LiveData 不需要; StateFlow 默认是防抖LiveData 默认不防抖; 对于 Android...与 LiveData 相比,没有和 Activity 生命周期绑定恐怕是使用 StateFlow 最不方便地方了。...,StateFlowLiveData使用差异区分,SharedFlow实现源码解析; pumpkin玄学; https://blog.csdn.net/weixin_44235109/article

1.2K50

StateFlow & ShareFlow) VS (Flow & LiveData)来看业务适合哪个?

StateFlowSharedFlow这两个特殊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

61240

StateFlow & ShareFlow) VS (Flow & LiveData

,但是生产过程中我们往往会借用这些基础api实现我们复杂逻辑处理,根据需求也推出了StateFlowSharedFlow这两个特殊flow。...切换线程 在flow内部不允许使用不同ConretineContext进行emit提交数据,所以想要在内部切换线程可以通过flowOn操作符进行转换 StateFlow & ShareFlow StateFlow...时候执行这个扩展函数;但是这两个Flow不一样他们不依赖于外部调用(可配置稍后说明),他们是热流,他们发出数据会缓存起来当有订阅者时候再通知订阅者 StateFlow 和 SharedFlow是发出状态更新并向多个使用方发出值并且可以通过...确实像,但他比LiveData更强大~~ StateFlow 线程切换:相比于LiveData更新数据操作只能在主线程进行,但是Flow可以通过flowOn来在不同Dispatchers(线程分发器...构建StateFlow &ShareFlow 官方示例: 将普通flow转换为ShareFlow(StateFlow一种)通过shareIn操作符 需要传入以下三个参数: (这三个参数) class

97940

解决Android开发中痛点问题用Kotlin Flow

kotlin 1.4.0正式版发布时推出了StateFlowSharedFlow,两者拥有Channel很多特性,可以看作是将Flow推向台前,将Channel雪藏幕后一手重要操作。...LiveData会保证订阅者总能在值变化时候观察最新值,并且每个初次订阅观察者都会执行一次回调方法。...如果认为1还可以通过开发规范控制,SharedFlow在无订阅者时会丢弃数据特性则让其彻底无缘被选用承载必须被执行事件 而StateFlow可以理解成特殊SharedFlow,也就无论如何都会有上面两点问题...当然,适合使用SharedFlow/StateFlow场景也有很多,下文还会重点研究。...基本等同于LiveData,区别在于StateFlow必须有初值,这也更符合页面必须有初始状态逻辑。

3.2K20

Kotlin中StateFlowSharedFlow有什么区别?

这次我们就对StateFlowSharedFlow进行深入对比: StateFlowSharedFlow 概述 StateFlow: 一种用于持有单一最新状态值并发射给多个观察者热流。...和livedata比较像,有新数据可以通知collect一方 同时又具有flow所有特点,比如可以挂起,切换线程 SharedFlow: 一种通用热流,可以发射事件流而不是仅限于持有最新状态。...SharedFlow设计是为了提供一个通用、可共享事件流机制,支持事件重播、缓存等。 状态持有和重播不同 StateFlow: 总是持有最新状态值。 新观察者会立即收到当前持有的状态值。...类型层次结构 StateFlow继承自SharedFlow,所以它是SharedFlow一种特化实现。...(2) _sharedFlow.emit(3) 重要API StateFlow value:获取或设置当前状态值。

10710

Flow 操作符 shareIn 和 stateIn 使用须知

Flow.shareIn 与 Flow.stateIn 操作符可以将冷流转换为热流: 它们可以将来自上游冷数据流信息广播给多个收集者。...它是一个使用 callbackFlow 实现 冷流。每个新收集者都会触发数据流生产者代码块,同时也会将新回调加入 FusedLocationProviderClient。...我们要讨论第一个话题是 shareIn 与 stateIn 之间区别。shareIn 操作符返回SharedFlow 而 stateIn 返回StateFlow。...注意 : 要了解有关 StateFlowSharedFlow 更多信息,可以查看 我们文档 。...StateFlowSharedFlow 一种特殊配置,旨在优化分享状态: 最后被发送项目会重新发送给新收集者,并且这些项目会使用 Any.equals 进行合并。

4.6K20

大揭秘,Android Flow面试官最爱问7个问题

StateFlowSharedFlow 问题: StateFlowSharedFlow有哪些区别?在什么场景下应该选择使用StateFlow而不是SharedFlow,反之亦然?...出发点: 这个问题旨在考察面试者对于StateFlowSharedFlow区别的理解,以及在实际项目中如何根据需求选择适当Flow。...在选择使用StateFlow还是SharedFlow时,需要考虑是否需要在订阅者之间共享历史元素。...为了解决这个问题,可以使用stateIn操作符来创建一个StateFlow,并在需要时将其转换SharedFlow。...结语 通过对Flow核心概念、错误处理机制、数据转换与合并、性能优化与背压处理等方面的深度剖析,相信读者能够更好地应对Android面试中关于Flow高级疑难问题。

21921

Android SingleLiveEvent Redux with Kotlin Flow

它可以被反复观察,并且通常由Kotlin StateFlowLiveData或其他类型数据存储来支持,暴露出一个单一值。但是我将会忽略这个流程,因为它不是本文重点。...然而,如果你感兴趣的话,有很多文章描述了如何用StateFlowLiveData实现UI状态。 第二个可观察流,也是本文重点,要有趣得多。这个数据流目的是通知视图执行一个动作,而且只有一次。...LiveData或任何conflates Kotlin flow,如StateFlow或ConflatedBroadcastChannel,都不合适。...Patrick Steiger文章《用LiveData替代StateFlowSharedFlow》中就有一个惊人小插曲。(这也是一篇很好读物)。...原文地址如下:https://proandroiddev.com/should-we-choose-kotlins-stateflow-or-sharedflow-to-substitute-for-android-s-livedata

97130

Android面试题之kotlin热流和channel

于冷流不同,在垃圾回收之前,flow里值都是存在内存之中,并且处于活跃状态 StateFlow StateFlow是一个状态容器式可观察数据流,可以向其收集器发出当前状态更新和新状态更新。...还可通过其value属性读取当前状态值 和livedata比较像,有新数据可以通知collect一方 同时又具有flow所有特点,比如可以挂起,切换线程 SharedFlow SharedFlow...会向其中收集值得所有使用方发出数据 也就是一对多关系,可以有多个collector 同时又具有flow所有特点,比如可以挂起,切换线程 和上面的StateFlow不同是,这个不能主动通知collect...方,需要不断emit元素,也就是利用了flow功能 channel 定义概念 channel实际上是一个并发安全队列,它可以用来连接协程,实现不同协程通信 channel实际上就是一个队列,队列中一定存在缓冲区...produce与actor返回channel都会随着对应协程执行完毕而关闭 对于一个channel,如果我们调用了它close方法,它会立即停止接受新元素,也就是说这时它isClosedForSend

7110

Flow简介

但是如果希望有多个计算结果返回回来,则可以使用 flow,flow有像Rxjava各种操作符,实现各种功能,同时和协程一起使用,可以替代Rxjava和liveData,并且也没有像Rxjava上手这么难...,因为在订阅之前已经被消费了,所以收不到数据 热流具体实现SharedFlowStateFlow,分别对应实现类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数据也执行结束才执行

92110
领券