Livedata 优点 1.保证UI与数据可以同步 Livedata 遵循观察者模式,并且 Livedata 会在生命周期变化的时候通知观察者。...6.适应屏幕旋转的数据保存 像屏幕旋转导致的 activity 或 fragment重创建之后,Livedata 会立即通知一下相应的观察者。保证了数据不会丢失。...在建立观察者关系之后,可以更新LiveData对象的值,如以下示例所示,当用户点击按钮时向所有观察者发出通知: mButton.setOnClickListener(new OnClickListener...setValue(T)方法更新LiveData实例的值,并通知活动观察者有关更改。...LiveData只在他们至少一个处于可见和活跃状态时才连接到系统服务。
LiveData是一个持有数据的容器类,它持有的数据是可以被观察者订阅的,当数据发生变化时会通知观察者,观察者可以是 Activity、Fragment、Service 等对象。...LiveData 具有感知观察者的生命周期能力,并且只有当观察者处于激活状态(STARTED、RESUMED)才会接收到数据更新的通知,在未激活时会自动解除注册观察者,以降低内存泄漏的风险。...因此,我们认为LiveData就是一个数据容器,它负责将数据包裹起来,使数据成为被观察者,当数据发生变化时,LiveData会通知观察者以便观察者做出响应。...通常情况下会在 ViewModel 中使用 MutableLiveData,然后 ViewModel 只会向观察者公开不可变的 LiveData 对象,如下所示。...同时,LiveData仅更新处于活跃生命周期状态的应用组件观察者,也即是说LiveData并不会通知所有的观察者,它只会通知处于活跃状态的观察者,那么它是如何做到这一点的呢?
架构库版本:1.0.0 Alpha 2 – June 2, 2017 LiveData 是一个数据持有者类,它持有一个值并允许观察该值。...vonInactive():当 LiveData 没有任何处于活动状态的观察者时该方法被调用。由于没有观察者在监听,所以没有理由保持与 LocationManager 的连接。...这是非常重要的,因为保持连接会显著消耗电量并且没有任何好处。 setValue():调用该方法更新 LiveData 实例的值,并将此变更通知给处于活动状态的观察者。...如果在调用时没有处于活动状态的观察者,在添加观察者之前不会进行任何运算。 该机制允许以较少的资源根据需要惰性运算来创建 LiveData。...MediatorLiveData 需要特别注意正确的向源 LiveData 传递其处于活动/闲置状态。有关详细信息,请参阅 Transformations 类。
LiveData是一个可观察的数据持有者类,它可以在数据发生变化时通知观察者。...它使用观察者模式来通知观察者数据发生了变化。当LiveData对象被观察时,它会将观察者添加到观察者列表中。当LiveData对象发生变化时,它会通知观察者。...当Activity或Fragment处于STARTED或RESUMED状态时,LiveData会将观察者添加到观察者列表中,并开始向观察者发送数据更新通知。...当Activity或Fragment处于STOPPED或DESTROYED状态时,LiveData会自动将观察者从观察者列表中移除,停止向其发送数据更新通知。...,当Activity处于STARTED或RESUMED状态时,LiveData将开始通知观察者数据更新。
此感知确保LiveData仅更新处于活动生命周期状态的应用程序组件观察者。 2.2 优点 1. 确保UI符合数据状态 LiveData遵循观察者模式。...当生命周期状态改变时,LiveData会向Observer发出通知。 您可以把更新UI的代码合并在这些Observer对象中。...不会因停止Activity而发生崩溃 如果Observer的生命周期处于非活跃状态,例如在后退堆栈中的Activity,就不会收到任何LiveData事件的通知。...LiveData对象一旦连接到系统服务,任何需要该资源的Observer都只需观察这个LiveData对象。...同时LiveData只会在LifecycleOwner处于Active的状态下通知数据改变,果数据改变发生在非 active 状态,数据会变化,但是不发送通知,等 owner 回到 active 的状态下
,例如在后端堆栈中的活动的情况下,则它不会收到任何 LiveData 事件 不再需要手动处理生命周期 UI 组件只是观察相关数据,不会停止或恢复观察。...LiveData 对象连接到系统服务一次,然后任何需要该资源的观察者都可以只观看 LiveData 对象 使用 LiveData 使用 LiveData 的常规步骤如下,我们按照下面这些步骤写一个简单的例子...在数据变动时及时通知 Observer,这一步通常在 UI 控制器中完成 注意:你可以使用 observeForever(Observer) 方法注册没有关联 LifecycleOwner 对象的观察者...在这种情况下,观察者被认为始终处于活动状态,因此始终会收到有关修改的通知。...你可以通过 removeObserver(Observer) 方法删除观察者 1、创建一个 LiveData LiveData 是一个包装器,可以包装任何数据,包括实现集合的对象,例如 List。
而 LiveData 规定了,当我们开发者订阅数据通知(调用observe())时,必须传递相应的 lifecycle 对象,其内部自然就是为了注册相应的观察者,从而做到生命周期感知,不然它怎么能自己解绑呢...setValue() 更新数据时,通知用户变更,我们需要新增一个观察者列表map,从而将用户 observe() 传递进来的观察者保存起来; 为了符合Android的生命周期,保证页面活跃状态才能收到通知...) } 在调用 observe() 订阅 Livedata 数据更新时,这里相当于添加了一个观察者,方法内部会将我们传递的 LifecycleOwner 与 观察者 包装为一个具体的生命周期观察者 wrapper...而又因为这个观察者是新添加进去的,观察者持有的数据版本号是默认的,即-1,但是 LiveData 内部的数据版本号可不是啊!,所以自然触发了数据更新通知。...LiveData 往往是为了界面数据的状态同步而作准备,所以当添加观察者后,被再次通知,也不难理解。
LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。...02.使用LiveData的优势 2.1 具有很明显的优点 UI和实时数据保持一致 因为LiveData采用的是观察者模式,这样一来就可以在数据发生改变时获得通知,更新UI。...4.2 使用LiveData配合ViewModel LiveData是一个数据的包装。具体的包装对象可以是任何数据,包括集合。它是一个抽象类,首先先创建一个类实现LiveData。...的 observe(),当数据更新后,LiveData 会通知它的所有活跃的观察者。..., 如有新的数据变更, 则不会再次通知到观察者。
✅ 让 UI 观察数据的变化,而不是直接向 UI 推送数据 臃肿的 ViewModel 能减轻你的担心的主意一定是个好主意。...理想情况下,ViewModels 在没有任何观察者的情况下不应该持有 ViewModel 的引用: ?...实现这种机制有很多方法: 通过 ViewModel.onCleared() 可以通知数据仓库丢掉对 ViewModel 的回凋。...Transformations.switchMap 允许你创建响应其他 LiveData 实例的改变的 LiveData ,它还允许在调用链上传递观察者的生命周期信息: LiveData repo...继承 LiveData LiveData 最常见的用例是在 ViewModel 中使用 MutableLiveData 并且将它们暴露为 LiveData 来保证观察者不会改变他们。
例如界面数据的更新,当数据发生变化时,我们要通知界面进行更新ui,这时我们可以使用LiveData在当前Activity/Fragment中对该数据注册一个观察者,实时监听数据的任何改动。...每一次改动LiveData都会发送通知给观察者。 另一方面,LiveData感知界面的生命周期,所以只有在界面生命周期的STARTED或者RESUMED状态才会通知观察者。...如果你一直处于后台且数据一直在变化,LiveData是不会发生通知,只有在界面再一次回到前台,这时LiveData才会发生通知且只会发送一次,数据的更新取的是最后一次的变化数据。...案例:对于App统计需求,一旦涉及到多个页面间的统计参数传递,可以自定义一个扩展LiveData来全局监听参数的传递与变化。...Transform 在通知观察者数据改变之前,如果你想改变LiveData中的值类型,可以使用Transformations Transformations.map() 获取原有类型中的某个特定的类型值
LiveData 只会将数据更新给活跃的观察者。 在添加观察者的时候,可以传入 LifecycleOwner 。...有了这关系,当 Lifecycle 对象状态为 DESTORYED 时,便可以移除这个观察者。 使用 LIveData 具有以下优势: 确保界面符合数据状态:数据发生变化时,就会通知观察者。...没有内存泄漏,因为关联了生命周期,页面销毁后会进行自我清理 不会因为Activity 停止而导致崩溃,页面处于非活跃状态时,他不会接收到任何 LiveData 事件 数据始终保持最新状态,页面如果变为活跃状态...,它会在变为活跃状态时接收最新数据 配置更改后也会接收到最新的可用数据 共享资源,可以使用单例模式扩展 LiveData 对象,以便在应用中共享他们 LiveData 的使用 LiveData 是一种可用于任何数据的封装容器...当没有任何活跃的观察者时,就会调用 onInactive 方法。
正是由于LiveData对组件生命周期可感知特点,因此可以做到仅在组件处于生命周期的激活状态时才更新UI数据。 LiveData需要一个观察者对象,一般是Observer类的具体实现。...当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化;在观察者处于其他状态时,即使LiveData的数据变化了,也不会通知。...LiveData的优点 UI和实时数据保持一致,因为LiveData采用的是观察者模式,这样一来就可以在数据发生改变时获得通知,更新UI。...避免内存泄漏,观察者被绑定到组件的生命周期上,当被绑定的组件销毁(destroy)时,观察者会立刻自动清理自身的数据。...不需要再解决生命周期带来的问题,LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化。 实时数据刷新,当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据。
而 StateFlow 则维护了一个可变的状态,并在状态发生变化时通知所有观察者。 热流与冷流 热流和冷流是关于数据流的两个基本概念,它们描述了数据流何时开始以及如何传递事件的方式。...热流是一种主动的数据流。它在创建时就开始发射事件,无论是否有观察者订阅。即使没有观察者,热流也会持续产生事件。当观察者订阅时,它只是加入了已经运行的数据流,开始接收当前已经产生的事件。...即没有观察者,数据会持续更新,与LiveData类似。其中MutableSharedFlow与MutableStateFlow是它们的可变类型。...默认值为 0,表示不回放任何元素。如果设置为正整数 n,则在订阅时将向新订阅者回放最近的 n 个元素。 extraBufferCapacity: 表示额外的缓冲容量,用于存储订阅者尚未消耗的元素。...初始化时必须给它设置一个初始值 每次发送数据都会与上次缓存的数据作比较,只有不一样才会发送。它还可直接访问它自己的value参数获取当前结果值,在使用上与LiveData相似。
2、LiveData如何感知生命周期? 总结:首先看数据:LiveData中的 mObservers 和 LifecycleRegistry 中的 mObserverMap。...关键对象: 1、LiveData: 作为数据入口,维护观察者和被观察者的关系 2、Observer:数据改变后最终触发的函数,回调接口,调用端实现 3、LifecycleOwner: Activity...添加观察者过程实际上是把 Observer 传递给 LiveData 对象 和 LifecycleRegistry 对象。...sync(); //源码前面有 } mAddingObserverCounter--; } 4、LiveData数据设置 LiveData有两种方式设置数据...setValue()中调用了dispatchingValue(),进而调用了considerNotify()来通知数据的改变。
} } class PlayerActivity : BaseActivity{ lifecycle.addObserver(videoPlayer) } 两步操作即可,不用我们自己向观察者...注册到被观察者(PlayerActivity)中, 这样Presenter也可以监测到Activity生命周期,并且代码结构没有任何改变,符合开闭原则(对扩展开发 修改关闭) LiveData基于观察者模式又做了哪些扩展...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...答案显而易见,无非是想让数据使用者感知到而已,而LiveData可以优雅的实现这一流程,将 改变、通知 两步操作合并为一步 即省事也提高了安全性....DataBinding最大的优点跟唯一的作用就是数据 UI双向绑定,UI和数据修改任何一方另外一方都会自动同步,这样的好处其实跟LiveData的类似,都是做数据跟UI同步操作,用来保证数据和UI一致性
主要思想就是用到了观察者模式思想,让观察者和被观察者解耦,同时还能感知到数据的变化,所以一般被用到ViewModel中,ViewModel负责触发数据的更新,更新会通知到LiveData,然后LiveData...再通知活跃状态的观察者。...不会因 Activity 停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件。...对象没有任何活跃观察者时,会调用 onInactive()方法。...否则正常通知到观察者的onChanged方法。 当然,如果想任何时候都能监听到,都能获取回调,调用observeForever方法即可。
这样Observer对象就与LiveData产生了订阅关系,当LiveData数据发生变化时通知,而在Observer更新数据,所以Observer通常是Activity和Fragment。...三个步骤就定义了使用LiveData的方式,从步骤可以看出,使用了观察者模式,当LiveData对象持有数据发生变化,会通知对它订阅的所有处于活跃状态的订阅者。...而这些订阅者通常是UI控制器,如Activity或Fragment,以能在被通知时,自动去更新Views。 创建LiveData对象 LiveData可以包装任何数据,包括集合对象。...将LiveData解耦,不和特定的Activity或Fragment绑定在一起。 创建 观察LiveData 的对象 有了数据源之后,总需要有观察者来观察数据源,不然数据源就失去了存在的意义。...当其中一个源数据发生变化是,都会回调订阅MediatorLiveData的观察者的onChanged()方法。例如我们在实际开发中,我们的数据源要么来自服务器,要么来自本地数据库。
} } class PlayerActivity : BaseActivity{ lifecycle.addObserver(videoPlayer) } 两步操作即可,不用我们自己向观察者...注册到被观察者(PlayerActivity)中, 这样Presenter也可以监测到Activity生命周期,并且代码结构没有任何改变,符合开闭原则(对扩展开发 修改关闭) 2.2 LiveData...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...答案显而易见,无非是想让数据使用者感知到而已,而LiveData可以优雅的实现这一流程,将 改变、通知 两步操作合并为一步 即省事也提高了安全性....DataBinding最大的优点跟唯一的作用就是数据 UI双向绑定,UI和数据修改任何一方另外一方都会自动同步,这样的好处其实跟LiveData的类似,都是做数据跟UI同步操作,用来保证数据和UI一致性
该组件的优势: 确保界面符合数据状态 LiveData 遵循观察者模式。...当观察的数据发生变化时,LiveData 会通知 [Observer]对象,实现被动更新,不需要主动去调用viewmodel获取数据。...不会因 Activity 停止而导致崩溃 如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件(也是通过LifecycleOwner实现的)...如果看源码会发现Observe有一个version版本号,而LiveData也有一个版本号是否调用观察者通知数据变化就是比对这两个版本号是否一致,ViewModel会保存LiveData实例,当重建时LiveData...LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。
领取专属 10元无门槛券
手把手带您无忧上云