首页
学习
活动
专区
工具
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

    4K30

    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()的,因为没有意义.

    1K20

    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 方法。

    98220

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

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

    3.6K10

    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.9K40

    Jetpack之LiveData详解

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

    1.7K20

    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.4K30

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

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

    3K30

    Jetpack组件之LiveData

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

    84130

    LiveData的前世今生

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

    1.1K10

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

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

    1.3K10

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

    92320

    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.6K20
    领券