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

为什么在观察LiveData时不调用onChanged()

在观察LiveData时不调用onChanged()的原因可能有以下几点:

  1. 数据没有发生变化:LiveData是一种可观察的数据持有类,它可以感知数据的变化并通知观察者。如果观察的LiveData对象的值没有发生变化,那么onChanged()方法就不会被调用。
  2. 观察者处于非活跃状态:LiveData会根据观察者的生命周期状态来决定是否通知观察者。如果观察者处于非活跃状态(例如,Activity或Fragment处于后台或已销毁状态),那么onChanged()方法也不会被调用。当观察者重新变为活跃状态时,LiveData会立即通知观察者最新的数据。
  3. 观察者没有正确注册:在观察LiveData之前,需要确保正确地注册观察者。通常,通过调用LiveData的observe()方法来注册观察者。如果没有正确注册观察者,onChanged()方法也不会被调用。
  4. 使用了错误的线程:LiveData默认在主线程上分发数据更新通知。如果在观察LiveData时指定了错误的线程,例如在后台线程上观察LiveData,那么onChanged()方法也不会被调用。可以使用LiveData的postValue()方法来在后台线程上更新LiveData的值,并确保观察者在主线程上接收到通知。

总结起来,当LiveData的值发生变化且观察者处于活跃状态时,onChanged()方法会被调用。确保正确注册观察者、使用正确的线程以及理解LiveData的生命周期管理是保证onChanged()方法被调用的关键。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

7.资源共享 通过继承LiveData类,然后将该类定义成单例模式,该类封装监听一些系统属性变化,然后通知LiveData观察者,这个继承LiveData中会看到具体的例子。...为什么LiveData会被定义成abstract而又没有抽象方法呢,这个…我也不知道,看了下LiveData的提交记录,是将hasObservers()替换getObserverCount()方法将...Observer接口就是观察者,其中定义了LiveData数据变化的回调方法onChanged()。...根据Fragment/Activity生命周期发生变化时,移除观察者或者通知观察者更新数据。 当调用LiveData的setValue()、postValue()方法后,通知观察者更新数据。...LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。

1.4K10

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

再点开,走到onStart()变为活跃onChanged调用,但value被onStart()中setValue的value覆盖,所以打印的是onChanged: onStart。...onActive()调用时机为:活跃的观察者(LifecycleOwner)数量从 0 变为 1 。...onInactive()调用时机为:活跃的观察者(LifecycleOwner)数量从 1 变为 0 。...* 观察者只LifecycleOwner活跃接受事件,如果变为DESTROYED状态,observer自动移除。 * 当数据非活跃更新,observer不会接收到。...这里为啥使用observeForever方法呢,这是因为源LiveData在外部使用时不会调用observer方法添加观察者,这里永远观察是为了LiveData数据变化时及时回调到 mObserver.onChanged

3.9K30

Jetpack源码解析—LiveData的使用及工作原理

Jetpack源码解析—Navigation为什么切换Fragment会重绘? 3. Jetpack源码解析—用Lifecycles管理生命周期 2....4.不需要手动处理生命周期 UI组件只需要去观察相关数据,不需要手动去停止或恢复观察LiveData会进行自动管理这些事情,因为观察,它会感知到相应组件的生命周期变化。 5....始终保持最新的数据 如果一个对象的生命周期变到非活跃状态,它将在再次变为活跃状态接收最新的数据。 例如,后台Activity返回到前台后立即收到最新数据。 6....LiveData中的代码很简洁,400多行的代码,看起来也并不费劲,下面我们来分析下整个流程: 通过使用LiveData对象,为它创建观察者Observer 创建Observer绑定Fragment生命周期...处于活动状态(例如onPasue()、onStop())LiveData是不会回调observe()的,因为没有意义.

99620

Android livedata 源码解剖

我们先来回顾一下 LiveData 的特点: LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或Service 等组件的生命周期。...的使用很简单,它是采用观察者模式实现的 添加观察者 在数据改变的时候设置 value,这样会回调 Observer 的 onChanged 方法 MutableLiveData nameEvent...已经 destroy,直接移除观察者。这也就是为什么我们不需要手动 remove observer 的原因。...mObserver 的 onChange 方法 observer.mObserver.onChanged((T) mData); } 如果状态不是活跃中,直接返回,这也就是为什么当我们的 Activity...判断数据是否是最新,如果是最新,返回,处理 数据不是最新,回调 mObserver.onChanged 方法。

94920

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

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

3.5K10

Android LiveData 使用详解

---- 为什么要引进 LiveData LiveData 是一个可以被观察的数据持有类,它可以感知 Activity、Fragment或Service 等组件的生命周期。...而当你如果使用 Livedata 的话,因为它是 Activity 处于 onStart 或者 onResume 的状态,他才会进行相应的回调,因而可以很好得处理这个问题,不必谢一大堆的 activity.isDestroyed...他们之间的区别是, 调用 setValue 方法,Observer 的 onChanged 方法会在调用 serValue 方法的线程回调。...这里我们以观察网络状态变化为例子讲解 首先我们自定义一个 Class NetworkLiveData,继承 LiveData,重写它的 onActive 方法和 onInactive 方法 onActive...但是,如果我们用 LiveData 来实现的话,它内部逻辑都帮我们封装好了,我们只需要保证 AccountLiveData 是单例的就ok,需要观察的地方调用 observer 方法即可。

4.8K40

Jetpack之LiveData详解

简介 LiveData 是Jetpack中的一个组件,是一个可被观察的数据存储器类, 具有感知组件生命周期的能力,LiveData 可以感知组件生命周期活跃状态发送数据更新,组件销毁移除观察者对象,...在给 LiveData 添加观察者对象的时候可以绑定一个具有生命周期的组件,当组件生命周期处于活跃状态(即 STARTED 、RESUMED 状态)时数据更新才会通知观察者,当组件被销毁则会自动移除对应的观察者对象...0 时调用,即无活跃的观察者对象时调用 MutableLiveData:可变的 LiveData,是我们最常用的 LiveData 子类。...LiveData 结合 ViewModel 使用 前面介绍 LiveData 的使用时都是直接在Activity里使用的,但是真实开发场景中我们一般直接在 Activity / Fragment 中使用而是...setValue 方法当前版本 mVersion++,最后则是调用观察者的回调,即我们传入的 Observer 的 onChanged 方法。

1.6K20

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

如果LiveData对象mCurrentName的值并未设置,则不调用onChanged()。 更新LiveData对象 LiveData没有公用的方法来更新存储的数据。...setValue(T)会导致Observer使用值"John Doe"调用onChanged()方法。...当更新数据库,会生成所有必要的代码来更新LiveData对象。 生成的代码需要在后台线程上异步运行查询。 这种模式对于保持用户界面中显示的数据与存储在数据库中的数据同步很有用。...这意味着你需要从这个方法开始观察股票价格的更新。 当LiveData对象没有任何活跃的Observer,onInactive()方法被调用。...这样做表示此Observer绑定了Lifecycle对象的生命周期,即: 1.如果Lifecycle对象处于活动状态,则即使值发生更改,也不会调用Observer。

2.2K30

Jetpack组件之LiveData

当数据发生变化时,LiveData 会通知观察者对象,无需每次应用数据发生变化时更新界面。...不需要手动处理生命周期 界面组件只是观察相关数据,不会停止或恢复观察LiveData 将自动管理所有这些操作,因为它在观察可以感知相关的生命周期状态变化。...更新页面的LiveData对象存储ViewModel中,而不将其存储Activity或Fragment中。...一种例外情况是,观察者从非活跃状态更改为活跃状态也会收到更新。此外,如果观察者第二次从非活跃状态更改为活跃状态,则只有自上次变为活跃状态以来值发生了更改时,它才会收到更新。...因此,使用完以后一定要调用removeObserver()停止对LiveData观察,否则会造成内存泄漏。

81030

Jetpack:在数据变化时如何优雅更新Views数据

又到周末好时光,茫茫人海中,与你掘金相遇,好幸运~请君赏阅本文,相处不易,开门见山,扯皮。...将LiveData解耦,不和特定的Activity或Fragment绑定在一起。 创建 观察LiveData 的对象 有了数据源之后,总需要有观察者来观察数据源,不然数据源就失去了存在的意义。...那么在哪里观察数据源呢? 大多数情况下,应用组件的onCreate()方法中访问LiveData是个合适的时机。...当然,如果此时LiveData没有存储值的话,onChange()方法不会被调用。 更新 LiveData 对象 LiveData本身没有提供公共方法更新值。...当其中一个源数据发生变化是,都会回调订阅MediatorLiveData的观察者的onChanged()方法。例如我们实际开发中,我们的数据源要么来自服务器,要么来自本地数据库。

2.9K30

LiveData的前世今生

用户点击按钮,于是跳转了Detail界面 用户按下返回键,回到列表界面中去 观察Activity处于Pause的堆栈中,会变成活动状态,返回,会再次成为活动状态 但此时,观察的值仍然是True...例如:一个值可以没有观察者活动的情况下被设置,所以新的观察者会直接取代它。另外,从不同的线程设置值可能会导致竞赛条件,只产生一个对观察者的调用。...确保你的用户界面与你的数据状态相匹配:LiveData遵循观察者模式,当生命周期状态改变LiveData会通知观察者对象。你可以整合你的代码来更新这些观察者对象中的UI。...你的观察者可以每次应用数据变化(生命周期变化)更新UI,而不是每次有变化时更新UI。 没有内存泄漏:观察者被绑定到生命周期对象,并在其相关的生命周期被销毁进行自我清理。...不再需要手动处理生命周期:UI组件只是观察相关的数据,而不需要主动停止或恢复观察LiveData会自动管理这一切,因为它在观察就知道相关的生命周期状态变化。

1.1K10

Android Jetpack - LiveData

LiveData 自动管理所有这些,因为它在观察意识到相关的生命周期状态变化 始终保持数据最新 如果生命周期变为非活动状态,它将在再次变为活动状态接收最新数据。...LiveData 对象 大多数情况下,从 app 组件的 onCreate() 方法是开始观察 LiveData 对象最合适,原因如下: onResume() 可能被多次调用,造成 Observer...} nameObserver 作为 observe() 的参数注册之后,一旦 name 发生变动且 MainActivity 处于活跃状态,onChanged() 方法就会被立即调用,然后 UI 会被更新...与 Room 一起使用 LiveData Room 持久化库支持可观察查询并返回 LiveData 对象,这些查询一般 DAO 中编写 更新数据库,Room 会生成更新 LiveData 对象所需的所有代码...具体可以参考 Android Jetpack - Room 一文所提供的代码示例 转换 LiveData 您可能希望LiveData 对象分派给观察者之前更改存储 LiveData 对象中的值,

2K30

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

这里需要注意的是,当我们调用 observe() 注册后,由于绑定了 owner,所以 active 的情况下,LiveData 如果有数据,则 Observer 会立马接受到该数据修改的通知。...的 postValue 方法其实就是把操作 post 到主线程,最后调用的还是 setValue 方法,注意 setValue 必须是主线程调用。...4.1 Sticky Event LiveData 被订阅,如果之前已经更改过数据,并且当前 owner 为 active 的状态,activeStateChanged() 会被调用,也即会立马通知到...,也即只会收到一次通知(set post混合调用则不一定); 如果 LiveData 有数据,并且 owner active 状态下,那么订阅的时候,会立马收到一次通知; 一个 Observer...总结 LiveData 基于观察者模式,并且可以感知生命周期,这使得我们使用 LiveData 既可以享受观察者模式带来的隔离数据与 UI 等强大的解耦能力,还可以享受感知生命周期带来的巨大便利。

88920

带你了解LiveData重放污染的前世今生

用户点击按钮,于是跳转了Detail界面 用户按下返回键,回到列表界面中去 观察Activity处于Pause的堆栈中,会变成活动状态,返回,会再次成为活动状态 但此时,观察的值仍然是True...例如:一个值可以没有观察者活动的情况下被设置,所以新的观察者会直接取代它。另外,从不同的线程设置值可能会导致竞赛条件,只产生一个对观察者的调用。...确保你的用户界面与你的数据状态相匹配:LiveData遵循观察者模式,当生命周期状态改变LiveData会通知观察者对象。你可以整合你的代码来更新这些观察者对象中的UI。...你的观察者可以每次应用数据变化(生命周期变化)更新UI,而不是每次有变化时更新UI。 没有内存泄漏:观察者被绑定到生命周期对象,并在其相关的生命周期被销毁进行自我清理。...不再需要手动处理生命周期:UI组件只是观察相关的数据,而不需要主动停止或恢复观察LiveData会自动管理这一切,因为它在观察就知道相关的生命周期状态变化。

1.2K10

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

下面代码讲解 抽象类,无法直接new 2、什么是MutableLiveData MutableLiveData的父类是LiveData 用法和LiveData类似,也是注册观察者回调里查看更新数据 可变...public void setAge(int age) { this.age = age; // postValue(this); // 如果写的话,单独调用setAge...其实如果这个数据的观察最前台就返回true,否则false。 hasObservers()   如果此LiveData具有观察者,则返回true。...super T> observer)   设置此LiveData数据当前activity或者Fragment的观察者,会给此activity或者Fragment在前台回调数据。...您需要手动调用removeObserver(Observer)以停止观察LiveData,   2.设置后此LiveData,一直处于活动状态,不管是否在前台哪里都会获得回调。

1.5K20
领券