等),此感知能力确保了 LiveData 只更新处于生命周期活跃状态的组件的观察者 生命周期活跃状态的定义是这些组件正处于 STARTED 或 RESUMED 状态,LiveData 只会更新活跃状态的观察者...在生命周期销毁时会立即取消数据观察订阅 LiveData 的优势 确保 UI 和数据状态同步 LiveData 遵循观察者模式。...每次应用程序数据更改时,你的观察者都可以在每次更改时更新 UI,而不是更新 UI 没有内存泄露 观察者绑定到 Lifecycle 对象,并在其相关生命周期被破坏后自行清理 不会因为活动停止而崩溃 如果观察者的生命周期处于非活动状态...例如,后台活动在返回前台后立即接收最新数据 配置更改友好 如果由于配置更改(例如设备轮换)而重新创建活动或片段,则会立即接收最新的可用数据 资源共享 你可以使用单例模式扩展 LiveData 对象以包装系统服务...LiveData 对象连接到系统服务一次,然后任何需要该资源的观察者都可以只观看 LiveData 对象 使用 LiveData 使用 LiveData 的常规步骤如下,我们按照下面这些步骤写一个简单的例子
那么可以想见,我们需要花额外的精力去构建和维护一个b和a的关系。 而响应式编程的想法正是企图用某种操作符帮助你构建这种关系。 它的思想完全可以用下面的代码片段来表达: ?...3.4 实现方案 遗憾的是我反复翻阅LiveData的源码也未找到合适的观察者接口。...基于这个方法,我们可以给LiveData添加观察者,打通了最难的一步。很妙的是观察者本身也是LiveData类型,这样我们就可以实现链式观察者的程序。 例如最基础的map操作符: ?...如前所述,为了应付各种各样的构建关系的情况,事实上我们做了非常多的LiveData Extension。 例如:转换 ? 例如:合并多个LiveData ? 更多的... ?...另外,我们更主张使用多个LiveData联合触发而非特别长的链式表达,如果确实需要特别长的链式表达,尤其是需要反复切换线程的情况,我们建议使用RxJava。
LiveData具有以下优点: 1.能够保证数据和UI统一 这个和LiveData采用了观察者模式有关,LiveData是被观察者,当数据有变化时会通知观察者(UI)。...二、LiveData使用 在了解LiveData定义和优点后,那它到底怎么应用呢?...MediatorLiveData可以看成是多个LiveData的代理,当将多个LiveData添加到MediatorLiveData,任何一个LiveData数据发生变化时,MediatorLiveData...根据Fragment/Activity生命周期发生变化时,移除观察者或者通知观察者更新数据。 当调用LiveData的setValue()、postValue()方法后,通知观察者更新数据。...在LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。
此感知确保LiveData仅更新处于活动生命周期状态的应用程序组件观察者。 2.2 优点 1. 确保UI符合数据状态 LiveData遵循观察者模式。...首先声明一个LiveData对象: private lateinit var liveData: MutableLiveData 点击开始观察数据按钮,弹出控制台,我们可以看到控制台输出了...//遍历LiveData的所有观察者执行下面代码 for (Iterator<Map.Entry<Observer<?...LiveData中的代码很简洁,400多行的代码,看起来也并不费劲,下面我们来分析下整个流程: 通过使用LiveData对象,为它创建观察者Observer 创建Observer时绑定Fragment生命周期...类,可以帮助我们实现这样的场景: 通过**Transformations.map()**使用一个函数来转换存储在 LiveData对象中的值,并向下传递转换后的值: LiveDataViewModel
源数据使用LiveData包装后,可以被observer观察,数据有更新时observer可感知。...观察者可以在生命周期状态更改时刷新界面,而不是在每次数据变化时刷新界面。 不会发生内存泄漏,observer会在LifecycleOwner状态变为DESTROYED后自动remove。...实现LiveData为单例模式,便于在多个Activity、Fragment之间共享数据。...的子类,允许合并多个 LiveData 源。...LiveData.this.mActiveCount == 0 是指 LiveData 的活跃观察者数量。
主要有如下两个作用: 实时刷新数据 防止内存泄漏 LiveData 采用的是观察者模式,当 LiveData 保存的数据发生变化时就会通知观察者,观察者接收到通知后可以进行 UI 数据刷新或者其他操作。...它的实现很简单,就是继承了 LiveData 然后向外暴露了 setValue、postValue 方法 MediatorLiveData:它继承自 MutableLiveData 可以监听多个 LiveData...数据源,或者调度多个 LiveData 数据源决定向观察者发送那个 LiveData 的数据更新。...的使用 前面 Hello LiveData 简单展示了 LiveData 的使用 LiveData 除了依赖生命周期对象实现观察者的自动管理外,还可以添加忽略生命周期的观察者, 使用 observeForever...LiveData 数据源,可以观察或调度多个 LiveData 数据源。
LiveData的粘性机制会带来副作用,但这本身并不是LiveData的设计缺陷,而是对它的过度使用。 Kotlin Flow是基于kotlin协程的一套异步数据流框架,可以用于异步返回多个值。...痛点一:蹩脚地处理ViewModel和View层通信 发现问题 当屏幕可旋转后,LiveData不好用了?...,页面需要更改的同时还会弹出Toast提示模式已切换。...LiveData会保证订阅者总能在值变化的时候观察到最新的值,并且每个初次订阅的观察者都会执行一次回调方法。...但选型时我们要考虑以下问题,也是LiveData被推荐使用的优势 : 是否会发生内存泄漏,观察者的生命周期遭到销毁后能否自我清理 是否支持线程切换,比如LiveData保证在主线程感知变化并更新UI 不会在观察者非活跃状态下消费事件
,它会在变为活跃状态时接收最新数据 配置更改后也会接收到最新的可用数据 共享资源,可以使用单例模式扩展 LiveData 对象,以便在应用中共享他们 LiveData 的使用 LiveData 是一种可用于任何数据的封装容器...= null) //根据条件返回对应的 livedata else //根据条件返回对应的 livedata } 合并多个 LiveData var live1 =...发送的数据是粘性的 例如再没有观察者的时候发送数据,此时 mVersion +1,等到真正添加了观察者后,生命周期也是活跃的,那么就会将这个数据重新分发到观察者。...代码可以参考这里 数据倒灌现象 一般情况下,LiveData 都是存放在 ViewModel 中的,当Activity重建的时候,观察者会被 remove 掉,重建后会添加一个新的观察者,添加后新的观察者版本号就是...这种解决方式和上面一样,反射修改版本号就可以解决 非活跃状态的观察者转为活跃状态后,只能接收到最后一次发送的数据。
LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。...的 observe(),当数据更新后,LiveData 会通知它的所有活跃的观察者。...e.生命周期变化后数据处理流程是怎么样的? f.为什么观察者只能与一个LifecycleOwner绑定,而不是多个?...wrapper对象过程; 需要注意的问题是,不能添加具有不同生命周期的相同观察者,否则就会抛出IllegalArgumentException异常,但是owner可以add多个Observer; 最后添加一个...调用 observe() 注册后,由于绑定了 owner,所以在 active 的情况下,使用LiveData中setValue发送数据,则 Observer 会立马接受到该数据修改的通知。
,代码中有一些模板代码(每个事件在ViewModel中都有一个或者多个新方法),而且容易出错;很容易忘记从观察者那里调用ViewModel。...确保你的用户界面与你的数据状态相匹配:LiveData遵循观察者模式,当生命周期状态改变时,LiveData会通知观察者对象。你可以整合你的代码来更新这些观察者对象中的UI。...Jose的解决方案缺乏对多个观察者的支持,而这正是LiveData以 "共享资源 "为名的承诺之一。 它不是线程安全的。 我还可以补充一个问题。...The recommended solution 你可以在LiveData类本身中找到处理多个观察者的标准方法,那就是将原始观察者包裹起来。...其次,每个观察者都会以自己的所有者身份注册到父级LiveData。
不同于普通的可观察者,LiveData 遵守应用程序组件的生命周期,以便 Observer 可以指定一个其应该遵守的 Lifecycle。...如果 Lifecycle 被销毁,那么自动移除观察者。 LiveData 是生命周期感知的事实给我们提供了一个新的可能:可以在多个 activity,fragment 等之间共享它。...LiveData 的转换 有时候可能会需要在将 LiveData 发送到观察者之前改变它的值,或者需要更具另一个 LiveData 返回一个不同的 LiveData 实例。...信息,以便只有在观察者观察到 LiveData 的返回时才运算这些转换。...如果在调用时没有处于活动状态的观察者,在添加观察者之前不会进行任何运算。 该机制允许以较少的资源根据需要惰性运算来创建 LiveData。
解决方法是从 ViewModel 中将导航的标志点击后立刻设为 false; fun userClicksOnButton() { _navigateToDetails.value = true...例如:当没有观察者处于监听状态时,可以设置一个值,因此新的值将会替换它。此外,从不同线程设置值的时候可能会导致资源竞争,只会向观察者发出一次改变信号。 但是这种方法的主要问题是难以理解和不简洁。...在导航事件发生后,我们如何确保值被重置呢? ❌ 可能更好一些:2....使用 LiveData 进行事件处理,在观察者中重置事件的初始值 通过这种方法,您可以添加一种方法来从视图中支出您已经处理了该事件,并且重置该事件。...这个方法将事件建模为状态的一部分:他们现在只是一个消耗或者不消耗的消息。 ? 使用事件包装器,您可以将多个观察者添加到一次性事件中。 ---- 总之:把事件设计成你的状态的一部分。
可接下来,当我们按下Home键回到桌面后,控制台的日志依然会持续打印。好家伙,这还得了? 这说明,即使我们的程序已经不在前台了,UI更新依然在持续进行当中。...但是上述例子当中,即使程序切到了后台,Flow依然没有中止,还是为它保留了过期数据,这就是一种内存上的浪费。 当然,我们这个例子非常简单,在实际项目中一个Flow可能又是由多个上游Flow合并而成的。...响应式编程是一种发送者和观察者配合工作的编程模式,由发送者发出数据消息,观察者接收到了消息之后进行逻辑处理。 普通场景下,这种发送者和观察者的工作模式还是很好理解的。...但是,如果在观察者还没有开始工作的情况下,发送者就已经先将消息发出来了,稍后观察者才开始工作,那么此时观察者还应该收到刚才发出的那条消息吗? 不管你觉得是应该还是不应该,这都不重要。...这里我抛出这个问题是为了引出粘性的定义。如果此时观察者还能收到消息,那么这种行为就叫做粘性。而如果此时观察者收不到之前的消息,那么这种行为就叫做非粘性。
Livedata 优点 1.保证UI与数据可以同步 Livedata 遵循观察者模式,并且 Livedata 会在生命周期变化的时候通知观察者。...2.Lifecycle对象被销毁后,Observer被自动删除。 3.LiveData对象具有感知生命周期的能力意味着您可以在多个Activity,Fragment和service之间共享它们。...Transformations.map() 使用一个函数来转换存储在LiveData对象中的值,并向下传递转换后的值。...合并多个LiveData源 MediatorLiveData是LiveData的一个子类,帮助您合并多个LiveData源。...在任何原始LiveData源对象改变后,MediatorLiveData对象的Observer会被触发。
LiveData是一个可观察的数据持有者类,它可以在数据发生变化时通知观察者。...合并LiveData 我们可以使用MediatorLiveData类将多个LiveData对象合并为一个LiveData对象。...为了避免内存泄漏,LiveData还需要与生命周期组件一起使用,以确保观察者只会在活动的生命周期内接收数据更新。...与生命周期组件的配合使用 LiveData通过与Lifecycle组件配合使用,实现了对观察者的自动添加和移除。...这样一来,我们就不必手动管理LiveData的观察者订阅和取消订阅,极大地简化了代码的编写和维护。
LiveData 具有感知观察者的生命周期能力,并且只有当观察者处于激活状态(STARTED、RESUMED)才会接收到数据更新的通知,在未激活时会自动解除注册观察者,以降低内存泄漏的风险。...观察者绑定到 Lifecycle 对象并在其相关生命周期 destroyed 后自行解除绑定。 不会因为 Activity 停止而发生奔溃。...如 Activity执行finish方法后,它就不会收到任何LiveData 事件。 不再需要手动处理生命周期。...由于LiveData可以在多个Activity、Fragment和Service中使用,所以可以创建单例模式。...同时,LiveData仅更新处于活跃生命周期状态的应用组件观察者,也即是说LiveData并不会通知所有的观察者,它只会通知处于活跃状态的观察者,那么它是如何做到这一点的呢?
LiveData 是一种可观察的数据存储器类。它是一个数据的容器,将数据包装起来,使数据成为被观察者,当数据发生变化时,观察者能够获得通知。...这种感知能力确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。 优势 确保界面符合数据状态 LiveData 遵循观察者模式。...不会因Activity停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。...后,就要利用它来完成ViewModel与页面间的通信。...} }); 合并多个LiveData 同时监听多个LiveData,只要其中一个LiveData更新则收到通知,通过LiveData的子类MediatorLiveData来实现。
LiveData 使用 setValue() 方法进行同步设置数据(必须在主线程调用),需要注意的是,设置数据后并不一定会回调 Observer#onChanged() 分发数据,而是需要同时满足 2...条件 2: 观察者的持有的版本号小于 LiveData 的版本号时。...和观察者各自会持有一个版本号 version,每次 LiveData#setValue 或 postValue 后,LiveData 持有的版本号会自增 1。...不过,虽然这个方法能够解决数据倒灌问题,但是会有副作用:对于多个观察者的情况,只允许第一个观察者消费,而后续的观察者无法消费实现,这一般是不能满足需求的。...这是因为事件总线缺乏 MVVM 模式建立的唯一可信源约束,事件发出后很难定位是哪个消息源推送出来的。
LiveData 的历史要追溯到 2017 年。彼时,观察者模式有效简化了开发,但诸如 RxJava 一类的库对新手而言有些太过复杂。...StateFlow 与 LiveData 是最接近的,因为: 它始终是有值的。 它的值是唯一的。 它允许被多个观察者共用 (因此是共享的数据流)。...它永远只会把最新的值重现给订阅者,这与活跃观察者的数量是无关的。 当暴露 UI 的状态给视图时,应该使用 StateFlow。这是一种安全和高效的观察者,专门用于容纳 UI 状态。...#2: 把一次性操作的结果暴露出来 这个例子与上面代码片段的效果一致,只是这里暴露协程调用的结果而无需使用可变属性。...liveData 协程构建器所使用的方法是 添加一个 5 秒钟的延迟,即如果等待 5 秒后仍然没有订阅者存在就终止协程。
领取专属 10元无门槛券
手把手带您无忧上云