为此,架构组件团队打造了 LiveData: 一个专用于 Android 的具备自主生命周期感知能力的可观察的数据存储器类。...接下来我们一起比较 LiveData 和 Kotlin 数据流中相对应的写法吧: #1: 使用可变数据存储器暴露一次性操作的结果 这是一个经典的操作模式,其中您会使用协程的结果来改变状态容器: △ 将一次性操作的结果暴露给可变的数据容器...#2: 把一次性操作的结果暴露出来 这个例子与上面代码片段的效果一致,只是这里暴露协程调用的结果而无需使用可变属性。...如果使用 LiveData,我们需要使用 LiveData 协程构建器: △ 把一次性操作的结果暴露出来 (LiveData) class MyViewModel(...) : ViewModel()...对于那些只执行一次的操作,您可以使用 Lazily 或者 Eagerly。然而,如果您需要观察其他的流,就应该使用 WhileSubscribed 来实现细微但又重要的优化工作,参见后文的解答。
例如,后台活动在返回前台后立即接收最新数据 配置更改友好 如果由于配置更改(例如设备轮换)而重新创建活动或片段,则会立即接收最新的可用数据 资源共享 你可以使用单例模式扩展 LiveData 对象以包装系统服务...LiveData 对象连接到系统服务一次,然后任何需要该资源的观察者都可以只观看 LiveData 对象 使用 LiveData 使用 LiveData 的常规步骤如下,我们按照下面这些步骤写一个简单的例子...,这一步通常在 UI 控制器中完成 3、使用 observer() 方法关联 Observer 和 LiveData ,observer() 方法持有 LifecycleOwner 对象,此订阅会让 LiveData...在数据变动时及时通知 Observer,这一步通常在 UI 控制器中完成 注意:你可以使用 observeForever(Observer) 方法注册没有关联 LifecycleOwner 对象的观察者...LiveData 对象 在大多数情况下,从 app 组件的 onCreate() 方法是开始观察 LiveData 对象最合适,原因如下: onResume() 可能被多次调用,造成 Observer
这种感知能力可确保LiveData 仅更新处于活跃生命周期状态的应用组件观察者。 应用组件观察者可以很安全的观察数据变化(绑定声明周期,自动绑定和移除),不用担心内存泄漏等问题。...当观察的数据发生变化时,LiveData 会通知 [Observer]对象,实现被动更新,不需要主动去调用viewmodel获取数据。...如果看源码会发现Observe有一个version版本号,而LiveData也有一个版本号是否调用观察者通知数据变化就是比对这两个版本号是否一致,ViewModel会保存LiveData实例,当重建时LiveData...版本号还是之前的版本号,而观察者此时重走OnCreate为0,所以可以收到上一次的数据变化通知 适当的配置更改 如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment...LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。
官网商城app团队在深度使用LiveData的过程中,也遇到了一些困难,尤其是在LiveData的观察者使用上踩到了不少坑,我们把这些经验在这里做一次总结与分享。...Java8 lambda的写法,所以编译器在编译的过程中自作聪明了一下,自动帮我们优化成都是添加的同一个静态的观察者,并不是10个,这就解释了为什么会出现map size为1的情况了。...对于for循环中间使用lambda的场景,当你的lambda中没有使用外部的变量或者函数的时候,那么不管是Java8的编译器还是Kotlin的编译器都会默认帮你优化成使用同一个lambda。...的值为3,然后3s之后我livedata 注册了一个观察者。...大家在这里可以试一下 把这个replay改成1,即可复现之前Livedata的问题。相比于前面两种解决方案,这个方案更加优秀,唯一的缺点就是Flow不支持Java,仅支持Kotlin。
LiveData对象一旦连接到系统服务,任何需要该资源的Observer都只需观察这个LiveData对象。 如何使用LiveData? 1.创建一个LiveData的实例来保存特定类型的数据。...您通常在UI控制器(如Activity或Fragment)中创建Observer对象。 3.使用observe()方法将Observer对象注册到LiveData对象。...通常在ViewModel中使用MutableLiveData,然后ViewModel仅向Observer公开不可变的LiveData对象。...注意:必须要从主线程调用setValue(T) 方法来更新LiveData 对象. 如果代码在工作线程中执行, 你可以使用postValue(T) 方法来更新LiveData对象....这意味着你需要从这个方法开始观察股票价格的更新。 当LiveData对象没有任何活跃的Observer时,onInactive()方法被调用。
❝老实说,LiveData是一个可观察的数据持有者。它让你的应用程序中的组件,通常是UI,能够观察LiveData对象的变化。...在UI组件中管理数据 使用一个监听器接口 使用事件总线 使用LiveData 总结 但首先,让我们介绍一下我们的示例方案。...一旦ProfileController得到数据并准备好更新用户界面,它就会回调传入的监听器(实际上是Activity)并调用它的一个方法。...例如,如果Activity经历了配置的改变,你的监听器引用可能是空的。另一个例子是,当你的监听器的生命周期是不活跃的,比如在后堆栈中的Activity,但你依然试图将事件传递给它并调用它的功能。...一旦存储库改变了存储在其LiveData实例中的FollowStatus值,Activity的onChanged代码就会被再次调用,因为Activity会观察FollowStatus并等待数据的改变。
与常规的可观察类不同,LiveData 具有生命周期感知能力,这意味着它具有感知应用组件(如 Activity、Fragment 或 Service)的生命周期的能力,并且LiveData仅更新处于活跃生命周期状态的应用组件观察者...通常,我们可以在UI控制器类中创建该Observer对象,如Activity或Fragment。 通过使用observe()方法将上述的LiveData对象和Observer对象关联在一起。...从上述步骤可以看出,LiveData使用了观察者模式,观察者通常是UI控制器,如Activity或Fragment,而被观察者则是LiveData包谷的数据对象, 当LiveData对象持有数据发生变化...并且,LiveData 仅在数据发生更改时才发送更新,并且仅发送给活跃观察者,如下所示。...同时,LiveData仅更新处于活跃生命周期状态的应用组件观察者,也即是说LiveData并不会通知所有的观察者,它只会通知处于活跃状态的观察者,那么它是如何做到这一点的呢?
❌ 避免在 ViewModel 里持有视图层的引用 推荐使用观察者模式作为 ViewModel 层和 View 层的通信方式,可以使用 LiveData 或者其他库中的 Observable 对象作为被观察者...例如,导航事件或显示 Snackbar 消息等应该仅被执行一次的操作。 事件的概念并不能和 LiveData 存取数据的方式完美匹配。...Transformations.switchMap 允许你创建响应其他 LiveData 实例的改变的 LiveData ,它还允许在调用链上传递观察者的生命周期信息: LiveData repo...继承 LiveData LiveData 最常见的用例是在 ViewModel 中使用 MutableLiveData 并且将它们暴露为 LiveData 来保证观察者不会改变他们。...如果你需要更多功能,扩展 LiveData 会让你知道什么时候有活跃的观察者。例如,当想要开始监听位置或传感器服务时,这将很有用。
LiveData 是一种可观察的数据存储器类。...这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。 官方介绍如下,其实说的比较清楚了,主要作用在两点: 数据存储器类。也就是一个用来存储数据的类。 可观察。...自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData...对象没有任何活跃观察者时,会调用 onInactive()方法。...通过改变存储值,来通知到观察者也就是调用onChanged方法。
Rouse 读完需要 10 分钟 速读仅需 4 分钟 在Android应用开发中,数据流是一个至关重要的概念。...默认值为 0,表示不使用额外的缓冲容量。设置为正整数 m 时,会在内部使用一个带有额外 m 容量的缓冲区。 onBufferOverflow: 表示在缓冲区溢出时的处理策略。...SharedFlow、StateFlow与LiveData的区别 StateFlow就是SharedFlow的一种特殊类型,特点有三: 它的replay容量为 1;即可缓存最近的一次粘性事件,如果想避免粘性事件问题...,使用SharedFlow,replay默认值0。...它还可直接访问它自己的value参数获取当前结果值,在使用上与LiveData相似。
目录介绍 01.LiveData是什么东西 02.使用LiveData的优势 03.使用LiveData的步骤 04.简单使用LiveData 05.observe()和observerForever(...自动解除数据订阅 要想使用LiveData(或者这种有可被观察数据能力的类)就必须配合实现了LifecycleOwner的对象使用。在这种情况下,当对应的生命周期对象DESTORY时,才能移除观察者。...03.使用LiveData的步骤 创建一个持有某种数据类型的LiveData (通常是在ViewModel中) 创建一个定义了onChange()方法的观察者。...调用 observe() 注册后,由于绑定了 owner,所以在 active 的情况下,使用LiveData中setValue发送数据,则 Observer 会立马接受到该数据修改的通知。...considerNotify(initiator); initiator = null; } else { //可以发现这里用到mObservers集合,使用迭代器遍历数据
LiveData简要快析 在官方的描述中,LiveData 如下所示: LiveData 是一种可观察的数据存储器类。...这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。...对象,然后对外暴漏 LiveData 对象,从而遵循开闭原则,外部调用者只允许订阅观察者,观察数据更新,而不允许主动通知数据更新,当然这也是 LiveData 的标准推荐用法。...比如常见于共享的 LiveData ,使用 LiveData 作为事件通知,大家会发现为什么刚刚 observe() 的观察者,马上就响应了数据更新,并且还是旧数据,那这是为什么呢?...但如果你想做更多事,比如想在发送数据时顺便处理一下,从而更自动的完成数据状态的处理,Flow 也许更加符合你的要求,当然你也可以随时将 Flow 转为传统的 LiveData 使用(对外部调用者而言)。
liveData实现事件总线 目录介绍 01.EventBus使用原理 02.RxBus使用原理 03.为何使用liveData 04.LiveDataBus的组成 05.LiveDataBus原理图...具体使用可以看demo代码,demo开源地址 03.为何使用liveData 为何使用liveData LiveData具有的这种可观察性和生命周期感知的能力,使其非常适合作为Android通信总线的基础构件...使用者不用显示调用反注册方法。LiveData具有生命周期感知能力,所以LiveDataBus只需要调用注册回调方法,而不需要显示的调用反注册方法。...而 ObserverWrapper.mLastVersion 的默认值是 -1, LiveData 只要更新过数据,mVersion 就肯定会大于 -1,所以订阅者会马上收到订阅之前发布的最新消息!!...这意味着给定的观察者将接收所有事件,并且永远不会 被自动删除。 您应该手动调用{@link #removeObserver(Observer)}来停止 观察这LiveData。
像这样,我们可以使用RxJava在我们的服务,所以我们可以操作数据与我们所有这个库提供的运营商和LiveData视图的一部分,这将使我们能够使一个实现,意识到我们的活动的生命周期的变化,甚至使用谷歌提供的视图模型...正是由于使依赖服务=>视图反转,而且不仅依赖视图=>服务,我们还可以做以下事情: 在运行时视图中添加/删除更多侦听器 时使用多个“侦听器”的相同视图。...基础架构层(数据)也很容易测试,因为我们所要做的就是模拟服务器的响应,为此,我们将使用来自OkHttp的MockWebServer。 发展方向?...观察前端架构的演变,认为Android正在接近一个类似Redux的架构并不是不合理的。...此外,这个视图模型可以直接将数据绑定注入到XML中,并使用LiveData将可视化组件绑定到LiveData的可观察对象。
Livedata 概览 LiveData 是一种可观察的数据存储器类。...LiveData 只会将更新通知给活跃的观察者。为观察 LiveData 对象而注册的非活跃观察者不会收到更改通知。 您可以注册与实现 LifecycleOwner 接口的对象配对的观察者。.../Fragment 的 onCreate 中注册 Livedata 监听(因为在 onStart 和 onResume 中进行监听可能会有冗余调用) Livedata 简单使用 仍然还是用我们倒计时的例子...: 界面上有两个按钮,点一次相当于点赞一次,我们点击十次按钮就在界面上展示文字提示用户已经点击了十次数据。...Livedata 和协程联合使用 emit 方式使用 引入依赖 有时候你可能需要处理异步任务,任务处理完成后刷新 ui 这种情况可以使用 Livedata 的扩展程序实现 本例我们实现下面的逻辑: 在
视图层(Activity 或者 Fragment)与 ViewModel 层进行通讯的一种便捷的方式就是使用 LiveData 来进行观察。...使用 LiveData 进行事件处理,在观察者中重置事件的初始值 通过这种方法,您可以添加一种方法来从视图中支出您已经处理了该事件,并且重置该事件。...✔️ 正确解决方法: 使用 SingleLiveEvent 这个 SingleLiveEvent 类是为了适用于特定场景的解决方法。这是一个只会发送一次更新的 LiveData。...如果您无意中添加了多个,则只会调用一个,并且不能保证哪一个。 ? ✔️ 推荐: 使用事件包装器 在这种方法中,您可以明确地管理事件是否已经被处理,从而减少错误。...使用事件包装器,您可以将多个观察者添加到一次性事件中。 ---- 总之:把事件设计成你的状态的一部分。使用您自己的事件包装器并根据您的需求进行定制。 银弹!
LiveData 是一种可观察的数据存储器类。它是一个数据的容器,将数据包装起来,使数据成为被观察者,当数据发生变化时,观察者能够获得通知。...这种感知能力确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。 优势 确保界面符合数据状态 LiveData 遵循观察者模式。...通过LiveData+ViewModel 完成一个计数器的例子。...= null) { value.setValue(value.getValue() + 1); } } 通常,LiveData仅在数据发生更改时才发送更新,并且仅发送给活跃观察者...因此,使用完以后一定要调用removeObserver()停止对LiveData的观察,否则会造成内存泄漏。
LiveData 实现原理分析 2.1 注册观察者的执行过程 LiveData 支持使用 observe() 或 observeForever() 两种方式注册观察者,其内部会分别包装为 2 种包装对象...,观察者绑定的生命处于活跃状态,并且 LiveData 存在已设置的旧数据; 2、调用 setValue() / postValue() 设置数据时,观察者绑定的生命周期处于活跃状态; 3、观察者绑定的生命周期由非活跃状态转为活跃状态...2.4 异步设置数据的执行过程 LiveData 使用 postValue() 方法进行异步设置数据(允许在子线程调用),内部会通过一个临时变量 mPendingData 存储数据,再通过 Handler...LiveData 重放问题需要区分场景来看 —— 状态适合重放,而事件不适合重放: 当 LiveData 作为一个状态使用时,在注册新观察者时重放已有状态是合理的; 当 LiveData 作为一个事件使用时...LiveData 数据重放问题的解决方案 这里我们总结一下业界提出处理 LiveData 数据重放问题的方案: 3.1 Event 事件包装器 实现一个事件包装器,内部使用一个标志位标记事件是否已经被消费过
LiveData、Kotlin Flow 和 RxJava 三者都属于 可观察的数据容器类,观察者模式是它们相同的基本设计模式,那么相对于其他两者,Kotlin Flow 的优势是什么呢?...对于简单的数据流场景,使用 LiveData 完全没有问题。...普通 Flow 的核心代码在 AbstractFlow 中,可以看到每次调用终端操作 collect,collector 代码块都会执行一次,也就是重新执行一次数据生产代码: AbstractFlow.kt...,会向新订阅者会重放一次最新值,也不允许重置重放缓存。...安全地观察 Flow 数据流 前面也提到了,Flow 不具备 LiveData 的生命周期感知能力,所以订阅者在监听 Flow 数据流时,会存在生命周期安全的问题。
一般情况下LiveData都是搭配这ViewModel使用,这里先介绍一下LiveData,再结合ViewModel使用 Android数据绑定技术一,企业级开发 Android数据绑定技术二,企业级开发...的使用 5、MutableLiveData的使用 6、LiveData和MutableLiveData的可变与不可变 7、其他方法 1、什么是LiveData LiveData是一个观察者模式的数据实体类...你可以在你需要被观察的数据里添加. 小注意点:如果不使用postValue(this)会怎么样?... 2.如果在主线程执行发布的任务之前多次调用此方法,则仅将分配最后一个值。 ...您需要手动调用removeObserver(Observer)以停止观察此LiveData, 2.设置后此LiveData,一直处于活动状态,不管是否在前台哪里都会获得回调。
领取专属 10元无门槛券
手把手带您无忧上云