首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android JetPack~LiveData(二) 数据倒灌问题

1、数据倒灌的出现 场景: 如果我们一个home页面获取网络数据,然后通过LiveData观察者特性,回调中跳转B页面,当旋转屏幕,页面重建,LiveData又发来最后一次数据,那么直接触发了跳转...因为LiveData的数据会保存在内存中。 数据倒灌原因: 个人描述:我们都知道LiveData是一个观察者模式,被观察者只要改变了观察者会收到通知。...页面重建LiveData自动推送最后一次数据供我们使用。 官方描述:ViewModel 将数据保留在内存中,这意味着开销要低于从磁盘或网络检索数据。...由于LiveData本身的特性,Activity的生命周期由非活跃变成活跃LiveData触发事件分发,导致屏幕旋转或者切换系统语言后出现数据倒灌。...如果当前Activity回到前台LiveData不需要接收最新的数据,可以使用下面三中扩展的LiveData 官方扩展的SingleLiveEvent 美团反射修改mVersion UnPeek-LiveData

1.7K20
您找到你想要的搜索结果了吗?
是的
没有找到

LiveData详细分析

LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态LiveData会通知观察者数据变化。...不需要再解决生命周期带来的问题 LiveData可以感知被绑定的组件的生命周期,只有活跃状态才会通知数据变化。...如果横竖屏切换(configuration change)不需要额外的处理来保存数据,当屏幕方向变化时,组件会被recreate,然而系统并不能保证你的数据能够被恢复的。...那么注册观察者之后的触发流程是怎样的?...联动生命周期,会自动 DESTROYED 的状态下移除 Observer ,取消订阅,所以不用担心内存泄露; LiveData观察者只能与一个LifecycleOwner绑定, 否则会抛出异常。

2.8K00

Android程序员该如何去手写事件通信方案LiveDataBus

2.减少内存泄漏 这是因为LiveData能够感知到组件的生命周期,当组件处于DESTROYED状态观察者对象会被清除掉。...6.针对configuration change不需要额外的处理来保存数据 我们知道,当你把数据存储组件中,当configuration change(比如语言、屏幕方向变化),组件会被recreate...7.资源共享 通过继承LiveData类,然后将该类定义成单例模式,该类封装监听一些系统属性变化,然后通知LiveData观察者,这个继承LiveData中会看到具体的例子。...为什么LiveData会被定义成abstract而又没有抽象方法呢,这个…我也不知道,看了下LiveData的提交记录,是将hasObservers()替换getObserverCount()方法将...LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。

1.4K10

Android从零开始搭建MVVM架构(4)——LiveData

Livedata 优点 1.保证UI与数据可以同步 Livedata 遵循观察者模式,并且 Livedata 会在生命周期变化的时候通知观察者。...4.不需要手动管理生命周期 UI 组件只需要关心相关的数据,不需要去手动变换生命周期状态,Livedata 已经帮你搞定了。...当你更新LiveData对象中存储的数据,所有注册了的Observer,只要所绑定的LifecycleOwner处于活动状态,就会被触发通知。...在建立观察者关系之后,可以更新LiveData对象的值,如以下示例所示,当用户点击按钮向所有观察者发出通知: mButton.setOnClickListener(new OnClickListener...当更新数据库,会生成所有必要的代码来更新LiveData对象。 生成的代码需要在后台线程上异步运行查询。 这种模式对于保持用户界面中显示的数据与存储在数据库中的数据同步很有用。

2.2K30

由浅入深,详解 LiveData 的那些事

当我们的观察者生命周期处于 STARTD 或者 RESUMED 状态,LiveData 就会认为当前观察者处于活跃状态,此时就会触发相应的更新通知,而非活跃的观察者自然不会收到通知。...) } 调用 observe() 订阅 Livedata 数据更新,这里相当于添加了一个观察者,方法内部会将我们传递的 LifecycleOwner 与 观察者 包装为一个具体的生命周期观察者 wrapper...,由此证明当前观察者尚未通知过,从而触发通知。...而又因为这个观察者是新添加进去的,观察者持有的数据版本号是默认的,即-1,但是 LiveData 内部的数据版本号可不是啊!,所以自然触发了数据更新通知。...,并重写相应的 onChanged() 方法,内部会去判断观察者当前版本号,如果当前版持有的版本号<我们自己维护,则触发更新,并且更新观察者版本号;当我们每次 setValue() ,并对 version

1.3K20

Jetpack之LiveData详解

简介 LiveData 是Jetpack中的一个组件,是一个可被观察的数据存储器类, 具有感知组件生命周期的能力,LiveData 可以感知组件生命周期活跃状态发送数据更新,组件销毁移除观察者对象,...在给 LiveData 添加观察者对象的时候可以绑定一个具有生命周期的组件,当组件生命周期处于活跃状态(即 STARTED 、RESUMED 状态)时数据更新才会通知观察者,当组件被销毁则会自动移除对应的观察者对象...(如 Activity / Fragment 等实现了LifecycleOwner 接口的对象)处于活跃状态即 STARTED 或 RESUMED 状态就会触发 Observer 的回调从而更新 mTextView...= MutableLiveData() liveData.observeForever { //do something } 这种情况当不需要进行观察的时候就需要手动调用 removeObserver...他们的作用都是将一个 LiveData 转换为另一个 LiveData 对象,当一个 LiveData 里的值发生改变另一个 LiveData的值也随之发生改变。

1.6K20

引入Jetpack架构后,你的App会发生哪些变化?

LiveData并不是只运用观察者模式 2.1 观察者模式的优点有哪些? 2.2 LiveData基于观察者模式又做了哪些扩展?...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错的概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣的可以翻回去查看。...2.3 LiveData + Lifecycle 实现 1 + 1 > 2 LiveDataLifecycle的加持下可以实现只可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的...当面临TextView之类的View单向驱动已经完全够用了,毕竟在我们的认知里是不需要通过TextView显示的文案改变对应数据的,此时单向驱动就能保证数据、UI一致。

82100

引入Jetpack架构后,你的App会发生哪些变化?

(VideoPlayer) 同时观察者不改变代码结构的情况随意扩展,比如PlayerActivity属于一个MVP架构,此时可以将Presenter实现ObserverLifecycle作为观察者 随后...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错的概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣的可以翻回去查看。...2.3 LiveData + Lifecycle 实现 1 + 1 > 2 LiveDataLifecycle的加持下可以实现只可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的...当面临TextView之类的View单向驱动已经完全够用了,毕竟在我们的认知里是不需要通过TextView显示的文案改变对应数据的,此时单向驱动就能保证数据、UI一致。

1.9K80

Android  JetPack~ LiveData (一)   介绍与使用

下面代码讲解 抽象类,无法直接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在前台回调数据。

1.5K20

“终于懂了“系列:Jetpack AAC完整解析(二)LiveData 完全掌握!

不需要手动解除观察,开发者不需要在onPause或onDestroy方法中解除对LiveData的观察,因为LiveData能感知生命周期状态变化,所以会自动管理所有这些操作。...只要任何原始的 LiveData 源对象发生更改,就会触发 MediatorLiveData 对象的观察者。...3.1 添加观察者 LiveData原理是观察者模式,下面就先从LiveData.observe()方法看起: /** * 添加观察者. 事件主线程分发....* 观察者LifecycleOwner活跃接受事件,如果变为DESTROYED状态,observer自动移除。 * 当数据非活跃更新,observer不会接收到。...LifecycleOwner生命周期状态变化时 判断如果是DESTROYED状态,则移除观察者LiveData自动移除观察者特点就来源于此。

3.9K30

引入Jetpack架构后,你的App会发生哪些变化?

(VideoPlayer) 同时观察者不改变代码结构的情况随意扩展,比如PlayerActivity属于一个MVP架构,此时可以将Presenter实现ObserverLifecycle作为观察者 随后...LiveData符合标准的观察者模式,所以它具备扩展性强、耦合性低的特性,同样它还是一个存储数据的容器,当容器数据改变时会触发观察者,即数据驱动。...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错的概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣的可以翻回去查看。...LiveData + Lifecycle 实现 1 + 1 > 2 LiveDataLifecycle的加持下可以实现只可见状态接收通知,说的通俗一点Activity执行了onStop()后内部的LiveData...引入Lifecycle后这个问题便可迎刃而解,liveData绑定Lifecycle(例子中的this)后,当回到ActivityA只会取liveData最新的值然后做通知,从而避免多余的操作引发的性能问题

1K31

从 Android 开发到读懂源码 第04期:LiveData 源码解析

正如注释所说,LiveData 是一个数据持有容器,并且该容器可以感知生命周期的变化,合适的时机通知观察者数据的变更。...和数据变化通知的回调接口,内部把回调接口包装成观察者 ObserverWrapper: LiveData liveData = new MutableLiveData();...,具备感知生命周期和触发外部回调的功能 // 生命周期感知也是一种观察者模型 LifecycleBoundObserver wrapper = new LifecycleBoundObserver...,主要核心是通知观察者的过程中引入了生命周期的感知,对于处于激活状态的 observer 才进行通知更新,当 observer 从非激活到激活状态也会收到通知。...重点是 observer 生命周期结束(Destroy),会自动释放 observer 的引用,从而避免了内存泄漏。

41320

LiveData的优势

当观察的数据发生变化时,LiveData 会通知 [Observer]对象,实现被动更新,不需要主动去调用viewmodel获取数据。...不会发生内存泄漏 观察者会绑定到 [Lifecycle],可以获取到应用组件的声明周期,当销毁自动取消订阅。...如果看源码会发现Observe有一个version版本号,而LiveData也有一个版本号是否调用观察者通知数据变化就是比对这两个版本号是否一致,ViewModel会保存LiveData实例,当重建LiveData...LiveData 对象连接到系统服务一次,然后需要相应资源的任何观察者只需观察 LiveData 对象。...这个具体场景就是搭配Room数据库返回LiveData的结合,之前需要手动去做逻辑变更,但现在唯一数据源是数据库只需要更改数据库即可,不需要再Activity中处理逻辑改变数据源,符合上一篇文章说到的单项数据流原则

1.2K20

LiveData三问—阿里真题

主要思想就是用到了观察者模式思想,让观察者和被观察者解耦,同时还能感知到数据的变化,所以一般被用到ViewModel中,ViewModel负责触发数据的更新,更新会通知到LiveData,然后LiveData...LiveData作为一种观察者模式设计思想,常常被和Rxjava一起比较,观察者模式的最大好处就是事件发射的上游 和 接收事件的下游 互不干涉,大幅降低了互相持有的依赖关系所带来的强耦合性。...自动判断生命周期并回调方法 如果观察者的生命周期处于 STARTED 或 RESUMED状态,则 LiveData 会认为该观察者处于活跃状态,就会调用onActive方法,否则,如果 LiveData...对象没有任何活跃观察者,会调用 onInactive()方法。...说说LiveData原理。 说到原理,其实就是两个方法: 订阅方法,也就是observe方法。通过该方法把订阅者和被观察者关联起来,形成观察者模式。

47730

【AAC 系列三】深入理解架构组件:LiveData

实际使用下来发现 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 等强大的解耦能力,还可以享受感知生命周期带来的巨大便利。

88820

Android livedata 源码解剖

它可以做到组件处于激活状态的时候才会回调相应的方法,从而刷新相应的 UI。 不用担心发生内存泄漏 当 config 导致 activity 重新创建的时候,不需要手动取处理数据的储存和恢复。...的使用很简单,它是采用观察者模式实现的 添加观察者 在数据改变的时候设置 value,这样会回调 Observer 的 onChanged 方法 MutableLiveData nameEvent...已经 destroy,直接移除观察者。这也就是为什么我们不需要手动 remove observer 的原因。...接着可以看到,onActive 会在 mActiveCount 为 1 触发,onInactive 方法则只会在 mActiveCount 为 0 触发。...Components 已经写了四篇文章了,其余的 Navigation, Paging library,Room,WorkMannager 等春节结束之后再更新了,欢迎关注我的公众号,有更新的话会第一公众好上面更新

94820

LiveData 还有学习的必要吗?—— Jetpack 系列(2)

: 当宿主生命周期进入消亡(DESTROYED)状态LiveData 会自动移除观察者,避免内存泄漏; 2、安全地回调数据: 宿主生命周期状态低于活跃状态(STAETED)LiveData 不会回调数据... LiveData#considerNotify(Observer) 尝试分发数据,会判断观察者持有版本号是否小于 LiveData 的版本号(Observer#mLastVersion >= LiveData...LiveData 重放问题需要区分场景来看 —— 状态适合重放,而事件不适合重放: 当 LiveData 作为一个状态使用时,注册新观察者重放已有状态是合理的; 当 LiveData 作为一个事件使用时...,注册新观察者重放已经分发过的事件就是不合理的。...实现方法是注册新观察者,通过反射的手段将观察者持有的版本号(Observer#mLastVersion)同步为 LiveData 的版本号。缺点是使用反射,但确实能够解决多观察者问题。

3.5K10
领券