② ON_CREATE:创建LifecycleOwner(下面会讲这个类)时将触发此事件。 ③ ON_DESTROY:LifecycleOwner被销毁时将触发此事件。...④ ON_PAUSE:LifecycleOwner暂停时将触发此事件。 ⑤ ON_RESUME:在LifecycleOwner恢复时触发此事件。...⑥ ON_START:启动LifecycleOwner时触发此事件。 ⑦ ON_STOP:LifecycleOwner停止时触发此事件。...触发事件后,生命周期将进入一个状态,然后在触发另一个事件时离开该状态并进入另一个状态。如下图所示: ?...要移除此Observer时必须手动调用removeObserver()。 ④ postValue(T value):在子线程中给LiveData设置值。
1、数据倒灌的出现 场景: 如果我们在一个home页面获取网络数据,然后通过LiveData的观察者特性,在回调中跳转B页面,当旋转屏幕时,页面重建,LiveData又发来最后一次数据,那么直接触发了跳转...因为LiveData的数据会保存在内存中。 数据倒灌原因: 个人描述:我们都知道LiveData是一个观察者模式,被观察者只要改变了观察者会收到通知。...在页面重建时,LiveData自动推送最后一次数据供我们使用。 官方描述:ViewModel 将数据保留在内存中,这意味着开销要低于从磁盘或网络检索数据。...由于LiveData本身的特性,Activity的生命周期由非活跃变成活跃时,LiveData会触发事件分发,导致屏幕旋转或者切换系统语言后出现数据倒灌。...如果当前Activity回到前台LiveData不需要接收最新的数据,可以使用下面三中扩展的LiveData 官方扩展的SingleLiveEvent 美团反射修改mVersion UnPeek-LiveData
LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。...不需要再解决生命周期带来的问题 LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化。...如果横竖屏切换(configuration change)时,不需要额外的处理来保存数据,当屏幕方向变化时,组件会被recreate,然而系统并不能保证你的数据能够被恢复的。...那么注册观察者之后的触发流程是怎样的?...在联动生命周期时,会自动在 DESTROYED 的状态下移除 Observer ,取消订阅,所以不用担心内存泄露; LiveData的观察者只能与一个LifecycleOwner绑定, 否则会抛出异常。
2.减少内存泄漏 这是因为LiveData能够感知到组件的生命周期,当组件处于DESTROYED状态时,观察者对象会被清除掉。...6.针对configuration change时,不需要额外的处理来保存数据 我们知道,当你把数据存储在组件中时,当configuration change(比如语言、屏幕方向变化)时,组件会被recreate...7.资源共享 通过继承LiveData类,然后将该类定义成单例模式,在该类封装监听一些系统属性变化,然后通知LiveData的观察者,这个在继承LiveData中会看到具体的例子。...为什么LiveData会被定义成abstract而又没有抽象方法呢,这个…我也不知道,看了下LiveData的提交记录,是在将hasObservers()替换getObserverCount()方法时将...在LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。
Livedata 优点 1.保证UI与数据可以同步 Livedata 遵循观察者模式,并且 Livedata 会在生命周期变化的时候通知观察者。...4.不需要手动管理生命周期 UI 组件只需要关心相关的数据,不需要去手动变换生命周期状态,Livedata 已经帮你搞定了。...当你更新LiveData对象中存储的数据时,所有注册了的Observer,只要所绑定的LifecycleOwner处于活动状态,就会被触发通知。...在建立观察者关系之后,可以更新LiveData对象的值,如以下示例所示,当用户点击按钮时向所有观察者发出通知: mButton.setOnClickListener(new OnClickListener...当更新数据库时,会生成所有必要的代码来更新LiveData对象。 生成的代码在需要时在后台线程上异步运行查询。 这种模式对于保持用户界面中显示的数据与存储在数据库中的数据同步很有用。
当我们的观察者生命周期处于 STARTD 或者 RESUMED 状态,LiveData 就会认为当前观察者处于活跃状态,此时就会触发相应的更新通知,而非活跃的观察者自然不会收到通知。...) } 在调用 observe() 订阅 Livedata 数据更新时,这里相当于添加了一个观察者,方法内部会将我们传递的 LifecycleOwner 与 观察者 包装为一个具体的生命周期观察者 wrapper...,由此证明当前观察者尚未通知过,从而触发通知。...而又因为这个观察者是新添加进去的,观察者持有的数据版本号是默认的,即-1,但是 LiveData 内部的数据版本号可不是啊!,所以自然触发了数据更新通知。...,并重写相应的 onChanged() 方法,内部会去判断观察者当前版本号,如果当前版持有的版本号<我们自己维护,则触发更新,并且更新观察者版本号;当我们每次 setValue() 时,并对 version
简介 LiveData 是Jetpack中的一个组件,是一个可被观察的数据存储器类, 具有感知组件生命周期的能力,LiveData 可以感知组件生命周期活跃状态发送数据更新,在组件销毁时移除观察者对象,...在给 LiveData 添加观察者对象的时候可以绑定一个具有生命周期的组件,当组件生命周期处于活跃状态(即 STARTED 、RESUMED 状态)时数据更新才会通知观察者,当组件被销毁时则会自动移除对应的观察者对象...(如 Activity / Fragment 等实现了LifecycleOwner 接口的对象)处于活跃状态即 STARTED 或 RESUMED 状态时就会触发 Observer 的回调从而更新 mTextView...= MutableLiveData() liveData.observeForever { //do something } 这种情况当不需要进行观察的时候就需要手动调用 removeObserver...他们的作用都是将一个 LiveData 转换为另一个 LiveData 对象,当一个 LiveData 里的值发生改变时另一个 LiveData的值也随之发生改变。
LiveData并不是只运用观察者模式 2.1 观察者模式的优点有哪些? 2.2 LiveData基于观察者模式又做了哪些扩展?...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错的概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣的可以翻回去查看。...2.3 LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的...当面临TextView之类的View时单向驱动已经完全够用了,毕竟在我们的认知里是不需要通过TextView显示的文案改变对应数据的,此时单向驱动就能保证数据、UI一致。
(VideoPlayer) 同时观察者在不改变代码结构的情况随意扩展,比如PlayerActivity属于一个MVP架构,此时可以将Presenter实现ObserverLifecycle作为观察者 随后...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错的概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣的可以翻回去查看。...2.3 LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的...当面临TextView之类的View时单向驱动已经完全够用了,毕竟在我们的认知里是不需要通过TextView显示的文案改变对应数据的,此时单向驱动就能保证数据、UI一致。
下面代码讲解 抽象类,无法直接new 2、什么是MutableLiveData MutableLiveData的父类是LiveData 用法和LiveData类似,也是在注册观察者回调里查看更新数据 可变...,setValue和postValue支持外部使用(public修饰) 普通类,可以直接new 3、LiveData与MutableLiveData区别 LiveData在实体类里可以通知指定某个字段的数据更新...myViewModel.getUserBean().removeObserver(observer); 5、MutableLiveData的使用 它是直接作用在变量上,mStr.setValue(s);触发观察者的回调...其实如果这个数据的观察者在最前台就返回true,否则false。 hasObservers() 如果此LiveData具有观察者,则返回true。...super T> observer) 设置此LiveData数据当前activity或者Fragment的观察者,会给此activity或者Fragment在前台时回调数据。
不需要手动解除观察,开发者不需要在onPause或onDestroy方法中解除对LiveData的观察,因为LiveData能感知生命周期状态变化,所以会自动管理所有这些操作。...只要任何原始的 LiveData 源对象发生更改,就会触发 MediatorLiveData 对象的观察者。...3.1 添加观察者 LiveData原理是观察者模式,下面就先从LiveData.observe()方法看起: /** * 添加观察者. 事件在主线程分发....* 观察者只在LifecycleOwner活跃时接受事件,如果变为DESTROYED状态,observer自动移除。 * 当数据在非活跃时更新,observer不会接收到。...在LifecycleOwner生命周期状态变化时 判断如果是DESTROYED状态,则移除观察者。LiveData自动移除观察者特点就来源于此。
vonInactive():当 LiveData 没有任何处于活动状态的观察者时该方法被调用。由于没有观察者在监听,所以没有理由保持与 LocationManager 的连接。...由于 fragment 在观察数据时提供了其 Lifecycle,所以 LiveData 会自动管理这一切。...信息,以便只有在观察者观察到 LiveData 的返回时才运算这些转换。...注销并且在每次调用 getPostalCode() 时重新注册到新的实例。...如果在调用时没有处于活动状态的观察者,在添加观察者之前不会进行任何运算。 该机制允许以较少的资源根据需要惰性运算来创建 LiveData。
(VideoPlayer) 同时观察者在不改变代码结构的情况随意扩展,比如PlayerActivity属于一个MVP架构,此时可以将Presenter实现ObserverLifecycle作为观察者 随后...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错的概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣的可以翻回去查看。...LiveData + Lifecycle 实现 1 + 1 > 2 LiveData在Lifecycle的加持下可以实现只在可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的LiveData...引入Lifecycle后这个问题便可迎刃而解,liveData绑定Lifecycle(例子中的this)后,当回到ActivityA时只会取liveData最新的值然后做通知,从而避免多余的操作引发的性能问题
正如注释所说,LiveData 是一个数据持有容器,并且该容器可以感知生命周期的变化,在合适的时机通知观察者数据的变更。...和数据变化通知的回调接口,内部把回调接口包装成观察者 ObserverWrapper: LiveData liveData = new MutableLiveData();...,具备感知生命周期和触发外部回调的功能 // 生命周期感知也是一种观察者模型 LifecycleBoundObserver wrapper = new LifecycleBoundObserver...,主要核心是在通知观察者的过程中引入了生命周期的感知,对于处于激活状态的 observer 才进行通知更新,当 observer 从非激活到激活状态也会收到通知。...重点是在 observer 生命周期结束(Destroy)时,会自动释放 observer 的引用,从而避免了内存泄漏。
当观察的数据发生变化时,LiveData 会通知 [Observer]对象,实现被动更新,不需要主动去调用viewmodel获取数据。...不会发生内存泄漏 观察者会绑定到 [Lifecycle],可以获取到应用组件的声明周期,当销毁时自动取消订阅。...如果看源码会发现Observe有一个version版本号,而LiveData也有一个版本号是否调用观察者通知数据变化就是比对这两个版本号是否一致,ViewModel会保存LiveData实例,当重建时LiveData...LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。...这个具体场景就是搭配Room数据库返回LiveData的结合,之前需要手动去做逻辑变更,但现在唯一数据源是数据库只需要更改数据库即可,不需要再Activity中处理逻辑改变数据源,符合上一篇文章说到的单项数据流原则
主要思想就是用到了观察者模式思想,让观察者和被观察者解耦,同时还能感知到数据的变化,所以一般被用到ViewModel中,ViewModel负责触发数据的更新,更新会通知到LiveData,然后LiveData...LiveData作为一种观察者模式设计思想,常常被和Rxjava一起比较,观察者模式的最大好处就是事件发射的上游 和 接收事件的下游 互不干涉,大幅降低了互相持有的依赖关系所带来的强耦合性。...自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData...对象没有任何活跃观察者时,会调用 onInactive()方法。...说说LiveData原理。 说到原理,其实就是两个方法: 订阅方法,也就是observe方法。通过该方法把订阅者和被观察者关联起来,形成观察者模式。
实际使用下来发现 LiveData 有几个特性: LiveData 的实现基于观察者模式; LiveData 跟 LifecycleOwner 绑定,能感知生命周期变化,并且只会在 LifecycleOwner...(图2.LiveData 类图) 3.2 LiveData 流程图 1) Lifecycle LifecycleOwner 生命周期改变触发流程: ?...4.1 Sticky Event LiveData 被订阅时,如果之前已经更改过数据,并且当前 owner 为 active 的状态,activeStateChanged() 会被调用,也即会立马通知到...Observer ,这样其实就类似 EventBus 的 sticky event 的功能,需要注意的是,有时候我们并不需要该功能。...总结 LiveData 基于观察者模式,并且可以感知生命周期,这使得我们使用 LiveData 既可以享受观察者模式带来的隔离数据与 UI 等强大的解耦能力,还可以享受感知生命周期带来的巨大便利。
它可以做到在组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI。 不用担心发生内存泄漏 当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。...的使用很简单,它是采用观察者模式实现的 添加观察者 在数据改变的时候设置 value,这样会回调 Observer 的 onChanged 方法 MutableLiveData nameEvent...已经 destroy,直接移除观察者。这也就是为什么我们不需要手动 remove observer 的原因。...接着可以看到,onActive 会在 mActiveCount 为 1 时触发,onInactive 方法则只会在 mActiveCount 为 0 时触发。...Components 已经写了四篇文章了,其余的 Navigation, Paging library,Room,WorkMannager 等春节结束之后再更新了,欢迎关注我的公众号,有更新的话会第一时间在公众好上面更新
它使用观察者模式来通知观察者数据发生了变化。当LiveData对象被观察时,它会将观察者添加到观察者列表中。当LiveData对象发生变化时,它会通知观察者。...当Activity或Fragment处于STARTED或RESUMED状态时,LiveData会将观察者添加到观察者列表中,并开始向观察者发送数据更新通知。...在观察LiveData时,我们可以使用observe()方法,并传入一个LifecycleOwner对象作为观察者。...除了observe()方法外,LiveData还提供了observeForever()方法,该方法允许我们传入一个普通的观察者对象,而不需要绑定到生命周期。...常见错误及解决方法 在使用LiveData时,经常会遇到一些常见错误。
: 当宿主生命周期进入消亡(DESTROYED)状态时,LiveData 会自动移除观察者,避免内存泄漏; 2、安全地回调数据: 在宿主生命周期状态低于活跃状态(STAETED)时,LiveData 不会回调数据...在 LiveData#considerNotify(Observer) 尝试分发数据时,会判断观察者持有版本号是否小于 LiveData 的版本号(Observer#mLastVersion >= LiveData...LiveData 重放问题需要区分场景来看 —— 状态适合重放,而事件不适合重放: 当 LiveData 作为一个状态使用时,在注册新观察者时重放已有状态是合理的; 当 LiveData 作为一个事件使用时...,在注册新观察者时重放已经分发过的事件就是不合理的。...实现方法是在注册新观察者时,通过反射的手段将观察者持有的版本号(Observer#mLastVersion)同步为 LiveData 的版本号。缺点是使用反射,但确实能够解决多观察者问题。
领取专属 10元无门槛券
手把手带您无忧上云