StateFlow 与 LiveData 是最接近的,因为: 它始终是有值的。 它的值是唯一的。 它允许被多个观察者共用 (因此是共享的数据流)。...(newUserId) }.asLiveData() } 使用 Kotlin 数据流的实现方式非常相似,但是省下了 LiveData 的转换过程: △ 观察带参数的数据流 (StateFlow...#5: 结合多种源: MediatorLiveData -> Flow.combine MediatorLiveData 允许您观察一个或多个数据源的变化情况,并根据得到的新数据进行相应的操作。...liveData 协程构建器所使用的方法是 添加一个 5 秒钟的延迟,即如果等待 5 秒后仍然没有订阅者存在就终止协程。...它会在 lifecycleOwner 进入 X 状态之前一直等待,又在离开 X 状态时挂起协程。对此,需要注意对应的协程只有在它们的生命周期所有者被销毁时才会被取消。
val data = aSuspedFunction() emit(data) } 一旦LiveData连接到任何观察者,它就会调用并接纳来自suspend函数的数据。...Transformation on Background 正如我们之前所分享的,LiveData转换是在主线程上完成的。这使得如果转换逻辑是计算密集型的,这种转换就成了问题。...该代码块在LiveData变得活跃时开始执行,当LiveData变得不活跃时,在一个可配置的超时后自动取消。如果它在完成之前被取消,那么如果LiveData再次变得活跃,它将被重新启动。...如果它在之前的运行中成功完成,它不会重新启动。注意,只有在自动取消的情况下才会重新启动。如果该块因任何其他原因被取消(例如抛出一个CancellationException),它不会被重新启动。...如果超时在coroutine运行结束前完成,coroutine将在Activity恢复活动时重新启动。
Kotlin Flow 是基于 Kotlin 协程基础能力搭建的一套数据流框架,从功能复杂性上看是介于 LiveData 和 RxJava 之间的解决方案。...并且在 Kotlin 协程的加持下,Kotlin Flow 目前是 Google 主推的数据流框架。 1. 为什么要使用 Flow?...LiveData、Kotlin Flow 和 RxJava 三者都属于 可观察的数据容器类,观察者模式是它们相同的基本设计模式,那么相对于其他两者,Kotlin Flow 的优势是什么呢?...如果有多个 flowOn 运算符,每个 flowOn 只会更改当前位置的上游数据流; 状态回调 onStart: 在数据开始发送之前触发,在数据生产线程回调; 状态回调 onCompletion: 在数据发送结束之后触发...安全地观察 Flow 数据流 前面也提到了,Flow 不具备 LiveData 的生命周期感知能力,所以订阅者在监听 Flow 数据流时,会存在生命周期安全的问题。
并且热流可以有多个订阅者;而冷流只有一个。...可以在 MutableSharedFlow 的构造函数中设置 cache 的大小,不能为负数,默认为 0....此处源代码还可以看出,SharedFlow 每次在 emit 之前,确实都会查看所在协程是否还在运行;且它确实是不会停止的,哪怕没有接收到新值,也会一直处于挂起等待的状态,想要结束则得使用截断类型的操作符...它还可直接访问它自己的 value 参数获取当前结果值,总体来说,在使用上与 LiveData 相似,下面是它俩的异同点对比。...2.1 与 LiveData 比较的相同点 均提供了 可读可写 和 仅可读 两个版本:MutableStateFlow、StateFlow 与 MutableLiveData、LiveData; 允许被多个观察者观察
而Kotlin Flow在可预见的时间里,我也上不太可能能在工作当中用得到,所以这个系列也就基本是属于我个人的学习笔记了。...当然,我们这个例子非常简单,在实际项目中一个Flow可能又是由多个上游Flow合并而成的。在这种情况下,如果程序进入了后台,却仍有大量Flow依然处于活跃的状态,那么内存问题会变得更加严重。...上述代码中的collect函数相当于LiveData中的observe函数。 StateFlow的基本用法就是这样了,现在让我们来运行一下程序吧: 看上去计时器已经可以正常工作了,非常开心。...如果此时观察者还能收到消息,那么这种行为就叫做粘性。而如果此时观察者收不到之前的消息,那么这种行为就叫做非粘性。 EventBus允许我们在使用的时候通过配置指定它是粘性的还是非粘性的。...因为非粘性的特性,它本身就不要求观察者在观察的那一刻就能收到消息,所以也没有传入初始值的必要。
官网商城app团队在深度使用LiveData的过程中,也遇到了一些困难,尤其是在LiveData的观察者使用上踩到了不少坑,我们把这些经验在这里做一次总结与分享。...[bf5febcc5a254e8b9c62095f23bdca6a~tplv-k3u1fbpfcp-zoom-1.image] 灰色没有了,代码变的简洁了,kpi在向我招手了,运行一下试试: 2021-...对于for循环中间使用lambda的场景,当你的lambda中没有使用外部的变量或者函数的时候,那么不管是Java8的编译器还是Kotlin的编译器都会默认帮你优化成使用同一个lambda。...2.2 配合ActivityViewModels要小心 Livedata的这种特性,在某些场景下会引发灾难性的后果,比如说,单Activity多Fragment的场景下,在没有Jetpack-mvvm组件之前...,在使用他的时候我们只要关注3个方面即可避坑: 谨慎使用Android Studio给出的lambda智能提示 多关注是否真的需要Observe 在注册监听之前的消息 Activity与Fragment
将可观察的数据暴露给观察者。通常与ViewModels的工作方式有关。 这是一个在Android社区相当成熟的惯例,但你会发现有一些文章有不同意见。...例如,当你在开始数据加载操作之前,你需要一个ID参数。有一个方便的模式,那就是使用Transformations.switchMap。...这意味着,如果调用的coroutine被取消了,你必须帮助Kotlin停止一个Job。比方说,你有一个启动无限循环的suspend函数。...它们只运行一次,可以返回一个结果 返回多个值的操作。...对一个数据源的订阅,可以在一段时间内发出多个值 One-shot operations with coroutines 使用suspend函数并使用viewModelScope或liveData{}
对于像Kotlin这样函数是一等公民的语言来说也是如此。尽管你可以将一个函数作为参数而不是UI组件本身传递,但在这里你也应该知道UI组件的生命周期,因为该函数通常会操作该组件的UI元素。...一旦存储库改变了存储在其LiveData实例中的FollowStatus值,Activity的onChanged代码就会被再次调用,因为Activity会观察FollowStatus并等待数据的改变。...这意味着我们可以将LiveData对象保存到数据库中,之后再将其作为普通的LiveData进行观察。这让我们可以在代码中的一个地方保存数据,并让另一个地方的代码,观察它数据的改变。...因此,处理这种需求的最好方法是不使用LiveData作为生产者,而是使用RX类型或Kotlin,因为Kotlin支持多种高阶函数以及对Collections和Sequence的扩展。...下面是一些例子,说明在Kotlin中使用高阶函数可以避免多少模板。
此外,这并不能保证在 Activity 或者 Fragment 停止之前启动我们的组件。特别是那些需要长期运行的操作,例如在 onStart()里的检查配置操作。...使用 Kotlin 协程来管理长时间运行的任务以及可以异步运行的其他操作。...详情参见: commit()) 如果观察者的关联生命周期至少不是 STARTED, LiveData 不会调用观察者,从而避免了这种极端情况。...在幕后,它在决定调用其观察者之前调用 isAtLeast() 判断当前状态。...而无需等待对 onStop() 的调用。
1 原文链接:https://proandroiddev.com/using-livedata-flow-in-mvvm-part-i-a98fe06077a0 最近,我一直在寻找MVVM架构中Kotlin...Flow是coroutines库中的一个反应式流,能够从一个Suspend函数中返回多个值。...你可以使用asLiveData扩展函数在ViewModel中把Flow转换为LiveData。...在Activity层面上消费主题更新是更好的,因为所有来自其他Fragment的更新都可以被安全地观察到。 让我们在ViewModel中获取主题更新。...(你可能会认为这是一个有多个LiveData源的MediatorLiveData)你可以使用合并函数来合并任何数量的流量。
img LiveData beyond the ViewModel 可观察范式在视图控制器和ViewModel之间工作得非常好,所以你可以用它来观察你的应用程序的其他组件,并利用生命周期意识的优势。...One-to-many dependency — MediatorLiveData MediatorLiveData允许你将一个或多个数据源添加到一个LiveData观察器中。...你可以存储一个对源的引用,然后在添加新的源之前将其删除。(Spoiler: this is what Transformations.switchMap does!...观察者只在订阅的时候接收分配给var的LiveData的更新,这是非常常见的。...Bonus section Tidying up with Kotlin 上面的MediatorLiveData例子显示了一些代码的重复,所以我们可以利用Kotlin的扩展函数。
简介 LiveData 是Jetpack中的一个组件,是一个可被观察的数据存储器类, 具有感知组件生命周期的能力,LiveData 可以感知组件生命周期活跃状态发送数据更新,在组件销毁时移除观察者对象,...它的实现很简单,就是继承了 LiveData 然后向外暴露了 setValue、postValue 方法 MediatorLiveData:它继承自 MutableLiveData 可以监听多个 LiveData...数据源,或者调度多个 LiveData 数据源决定向观察者发送那个 LiveData 的数据更新。...LiveData 数据源,可以观察或调度多个 LiveData 数据源。...ViewModel 中使用,然后在 Activity / Fragment 中观察 ViewModel 里 LiveData 数据的变化: java: public class MainViewModel
背景 大力智能客户端团队在平板端大力一起学App上深度适配了横竖屏场景,将原先基于Rxjava的MVP架构重构成基于LiveData+ViewModel+Kotlin协程的MVVM架构。...LiveData的粘性机制会带来副作用,但这本身并不是LiveData的设计缺陷,而是对它的过度使用。 Kotlin Flow是基于kotlin协程的一套异步数据流框架,可以用于异步返回多个值。...LiveData会保证订阅者总能在值变化的时候观察到最新的值,并且每个初次订阅的观察者都会执行一次回调方法。...对于UI来说只需关心最终状态,但对于一些事件,并不全是希望按照LiveData的合并策略将最新一条之前的事件全部丢弃。绝大部分情况是希望每条事件都能被执行,而LiveData并非为此设计。...但选型时我们要考虑以下问题,也是LiveData被推荐使用的优势 : 是否会发生内存泄漏,观察者的生命周期遭到销毁后能否自我清理 是否支持线程切换,比如LiveData保证在主线程感知变化并更新UI 不会在观察者非活跃状态下消费事件
它建立在Kotlin语言的suspend函数上,suspend函数标记的方法能够挂起当前协程的执行,并在异步任务完成后恢复执行。...一旦挂起函数的异步操作完成,协程会根据之前保存的状态恢复执行,就好像从挂起的地方继续运行一样,这使得异步编程变得自然、优雅。...基本用法 并发与并行 使用async函数,我们可以实现并发操作,同时执行多个异步任务,并等待它们的结果。而使用launch函数,则可以实现并行操作,多个协程在不同线程上同时执行。...: Resource() } 在Activity或Fragment中使用ViewModel,并观察数据变化: class MyActivity : AppCompatActivity...我们通过emit()函数发送不同的数据状态,Activity(或Fragment)通过观察LiveData来处理不同的状态,并相应地更新UI。
挂起函数 在Kotlin Coroutine中,挂起函数是一种特殊的函数,它可以在协程内部被挂起,等待异步操作完成而不会阻塞线程。挂起函数是协程异步编程的核心。...suspend fun fetchUserData(): UserData { // 执行异步操作,等待数据返回 } 在协程中调用挂起函数 在协程内部调用挂起函数是直接的,你可以像调用普通函数一样调用挂起函数...)可以在挂起函数内部创建新的协程,它会等待所有的子协程完成后再继续执行。...并发与顺序性 在异步编程中,既需要处理多个任务的并发执行,也需要确保一些操作按照特定的顺序执行。Kotlin Coroutine提供了灵活的机制来处理并发和顺序性操作,同时能够简化多个协程的组合。...通过使用launch函数,我们可以在不同的协程中同时执行多个任务,而这些协程可以在相同的作用域内运行,继承相同的上下文和调度器。
,又可以承担观察LiveData的角色,那我们最理想的代码应该是这样: ?...基于这个方法,我们可以给LiveData添加观察者,打通了最难的一步。很妙的是观察者本身也是LiveData类型,这样我们就可以实现链式观察者的程序。 例如最基础的map操作符: ?...如前所述,为了应付各种各样的构建关系的情况,事实上我们做了非常多的LiveData Extension。 例如:转换 ? 例如:合并多个LiveData ? 更多的... ?...我们在git上开源了这些LiveData扩展函数,你可以通过这个网址[LiveDataExtensions](https://github.com/GunNan/LiveDataExtensions)获取到更多的操作符以及源码的信息...另外,我们更主张使用多个LiveData联合触发而非特别长的链式表达,如果确实需要特别长的链式表达,尤其是需要反复切换线程的情况,我们建议使用RxJava。
State是一种基于观察者机制的组件,它的用法和LiveData类似,因此非常的简单易懂。...现在你可以重新运行一下程序,计数器的效果应该和之前一样的。 既然效果一模一样,那么经过状态提升后的Counter函数到底好在哪里呢?...如果你对Kotlin Flow的用法还不熟悉,可以在我的公众号主页回复“Flow”,就能看到我之前写的Kotlin Flow三部曲了。...说到StateFlow,它本来和LiveData的用法就极其相似,最大的不同点可能就在于StateFlow是用Kotlin编写的,它可以在初始化的时候就传入一个初始值,从而确保它的值永远不会为空。...因此我们在incrementCount()和incrementDoubleCount()函数里可以直接对其加1加2,而不用像之前LiveData那样写一段很奇怪的空指针保护代码了。
Collect是Kotlin Flow的首选术语(我们Collect一个Flow),观察是Android的LiveData的首选术语(我们观察一个LiveData)。...在这种情况下,你可以通过使用Flow.asLiveData()扩展函数在ViewModel中轻松地从Flow转换为LiveData。...但还有一个问题:因为Flow是声明性的,并且只在收集时运行(物化),如果我们有多个收集器,那么每个收集器都会运行一个新的Flow,彼此之间完全独立。...SharedFlow to the rescue SharedFlow是一个允许在多个Collecter之间共享自身的流,因此对于所有同时进行的收集器来说,只有一个流被有效运行(物化)。...这类似于我们之前通过在onActive()回调中添加GeoQuery监听器和在onInactive()回调中删除监听器来实现的LiveData行为。
❌ 避免在ViewModels中对View进行引用。 在ViewModels和View之间进行通信的推荐方式是观察者模式,使用LiveData或来自其他库的观察变量方式。...ViewModel在配置变化时被持久化,所以当重新请求发生时,不需要重新查询外部数据源(如数据库或网络)。 当长期运行的操作结束时,ViewModel中的观察变量会被更新。数据是否被观察并不重要。...如果你有多个非常不同的数据模型,可以考虑添加多个存储库。...Leaking ViewModels 反应式范式在Android中运行良好,因为它允许在UI和你的应用程序的其他层之间建立一个方便的连接。...你也可以使用onActive()来启动一些加载数据的服务,但除非你有很好的理由,否则你不需要等待LiveData的观察。
总之,MVVM架构最好的部分是ViewModel,但我认为它没有遵循MVC模式中定义的Model概念,因为在MVVM中,DAO(数据访问对象)的抽象被认为是Model,视图观察来自ViewModel的多个可观察属性的状态变化...另外,这些来自ViewModel的多个可观察属性会导致状态重叠问题(两个不同的状态被意外显示)。 MVI模式通过添加一个实际的 "Model "层来解决这个问题,该层由视图观察状态变化。...MVI + LiveData + ViewModel = ❤️ Architecture: 在继续之前,让我们重新强调一下MVI架构中的一些基本术语。...每次有任何用户的输入/动作,我们都会暴露这个类的修改过的副本(以保持之前没有被修改的状态)。我们可以使用Kotlin的Data Class来创建这个Model。...另外,它在内部创建了viewStateObserver、viewEffectObserver LiveData-Observers,并开始观察ViewModel在Activity的onCreate()中暴露的