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

ViewModel不会触发可变observer的观察者

ViewModel是一种设计模式,用于将用户界面的数据和逻辑与后端数据模型进行分离,以提供更好的代码组织和可维护性。在云计算领域中,ViewModel常用于构建Web应用程序或移动应用程序。

ViewModel的主要优势是实现了数据和UI的解耦,使得开发人员可以专注于业务逻辑的实现而不必担心数据的显示和更新。它提供了一个可观察的数据模型,即可变observer,在数据变化时会通知观察者进行相应的更新。然而,这里提到的是ViewModel不会触发可变observer的观察者,意味着在某些情况下,观察者不会收到对ViewModel的更改通知。

这种情况可能发生在以下几种情况下:

  1. 观察者未正确注册或未正确实现观察者模式。在使用ViewModel时,必须确保正确地注册观察者,并实现相应的观察者模式以接收和处理数据更改通知。如果观察者未正确实现,或者未正确注册到ViewModel中,那么它将无法接收到对ViewModel的更改通知。
  2. 数据更改未导致可观察性属性的更新。在ViewModel中,只有被标记为可观察的属性才会触发观察者的通知。如果数据更改不会影响可观察性属性,那么观察者将不会收到通知。
  3. 观察者处于非活动状态。如果观察者当前处于非活动状态,例如在后台或休眠状态,那么它将无法接收到对ViewModel的更改通知。这可能导致观察者无法及时更新UI或执行相应的逻辑。

为了解决这些问题,开发人员可以采取以下措施:

  1. 确保正确注册和实现观察者模式。在ViewModel和观察者之间建立正确的通信机制,确保观察者能够接收和处理数据更改通知。
  2. 检查数据更改是否涉及可观察性属性。如果不是,可以考虑在数据更改时手动通知观察者,以确保它们能够及时收到更新通知。
  3. 确保观察者处于活动状态。在观察者暂时不活动的情况下,例如在后台或休眠状态,可以考虑在重新活动时手动检查并更新UI或执行相应的逻辑。

总结起来,ViewModel不会触发可变observer的观察者可能是由于观察者未正确注册或实现观察者模式、数据更改未导致可观察性属性的更新、或观察者处于非活动状态所导致的。为了解决这些问题,开发人员需要确保正确注册和实现观察者模式,检查数据更改是否涉及可观察性属性,并确保观察者处于活动状态。

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

相关·内容

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

使用 6、LiveData和MutableLiveData可变与不可变 7、其他方法 1、什么是LiveData LiveData是一个观察者模式数据实体类,它可以在所有注册观察者回调里查看数据是否有更新...LiveData它能感知绑定者生命周期(如Activity,Fragment),不会发生内存泄露,因为它只会给活跃状态activity回调,我们在使用时候通常都会在回调里去更新UI。...下面代码讲解 抽象类,无法直接new 2、什么是MutableLiveData MutableLiveData父类是LiveData 用法和LiveData类似,也是在注册观察者回调里查看更新数据 可变...使用 它是直接作用在变量上,mStr.setValue(s);触发观察者回调。...observeForever(@NonNull Observer observer)   1.设置永远观察者,永远不会被自动删除。

1.5K20
  • 今天撸一波Jetpack下Lifecycle、ViewModel和LiveData

    ② removeObserver():可以调用此方法从Lifecycle观察者列表中删除给定观察者。从生命周期中删除观察者将不再接收任何触发事件。...所持有的,那么这个被网络请求更新数据就不会通知给Activity A。...如果它不是DESTROYED,那么此时观察者Observer将被添加到LiveData观察者列表中,同时该观察者会LifecycleOwner绑定,如果LifecycleOwner生命周期状态变成DESTROYED...这时候就算其持有的数据更新了,也不会发起通知。 3.4 其他方法 ① hasActiveObservers():检查LiveData中是否有活跃观察者。...③ observeForever(Observer observer):用于将一个Observer添加到一个活跃列表中,该列表将始终保持ACTIVE状态,因此永远不会自动从Observer实例列表中移除它

    1.5K10

    Android Jetpack架构组件(四)之LiveData

    那相比其他一些观察者技术,如RxJava什么,LiveData有哪些优势吗,下面是官方给出一些优点列举。 确保 UI 界面始终和数据状态保持一致。 不会发生内存泄漏。...观察者绑定到 Lifecycle 对象并在其相关生命周期 destroyed 后自行解除绑定。 不会因为 Activity 停止而发生奔溃。...而LiveData作用就是包装ViewModel中数据,并让被观察者能够观察数据变化。下图是官方Jetpack架构示意图。...通常情况下会在 ViewModel 中使用 MutableLiveData,然后 ViewModel 只会向观察者公开不可变 LiveData 对象,如下所示。...同时,LiveData仅更新处于活跃生命周期状态应用组件观察者,也即是说LiveData并不会通知所有的观察者,它只会通知处于活跃状态观察者,那么它是如何做到这一点呢?

    3.1K00

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

    1、数据倒灌出现 场景: 如果我们在一个home页面获取网络数据,然后通过LiveData观察者特性,在回调中跳转B页面,当旋转屏幕时,页面重建,LiveData又发来最后一次数据,那么直接触发了跳转...这就是数据倒灌引起问题。因为LiveData数据会保存在内存中。 数据倒灌原因: 个人描述:我们都知道LiveData是一个观察者模式,被观察者只要改变了观察者会收到通知。...ViewModel 与一个 Activity(或其他某个生命周期所有者)相关联,在配置更改期间保留在内存中,系统会自动将 ViewModel 与发生配置更改后产生新 Activity 实例相关联。...倒灌原因小结 Activity异常销毁然后重建,ViewModel会保存销毁之前数据,然后在Activity重建完成后进行数据恢复,所以LiveData成员变量中mVersion会恢复到重建之前值...由于LiveData本身特性,Activity生命周期由非活跃变成活跃时,LiveData会触发事件分发,导致屏幕旋转或者切换系统语言后出现数据倒灌。

    2.1K20

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

    既然生命周期同步如此重要,Google肯定不会视而不见,虽然自定义ObserverLifecycle可以解决这种问题,但并不是每个人都能想到。...LiveData符合标准观察者模式,所以它具备扩展性强、耦合性低特性,同样它还是一个存储数据容器,当容器数据改变时会触发观察者,即数据驱动。...observe(this, Observer { value-> textView.text = value }) //这一步会改变liveData值并且会触发textView...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣可以翻回去查看。...ViewModel官方定义是一个带作用域状态托管框架,为了将其状态托管发挥到极致,Google甚至单独为ViewModel开了个后门,Activity横竖屏切换时不会销毁对应ViewModel,为就是横竖屏能共用同一个

    1K31

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

    既然生命周期同步如此重要,Google肯定不会视而不见,虽然自定义ObserverLifecycle可以解决这种问题,但并不是每个人都能想到。...LiveData符合标准观察者模式,所以它具备扩展性强、耦合性低特性,同样它还是一个存储数据容器,当容器数据改变时会触发观察者,即数据驱动。...observe(this, Observer { value-> textView.text = value }) //这一步会改变liveData值并且会触发textView...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣可以翻回去查看。...横竖屏切换时不会销毁对应ViewModel,为就是横竖屏能共用同一个ViewModel,从而保证数据一致性。

    1.9K80

    LiveData前世今生

    例如:一个值可以在没有观察者活动情况下被设置,所以新观察者会直接取代它。另外,从不同线程设置值可能会导致竞赛条件,只产生一个对观察者调用。...,代码中有一些模板代码(每个事件在ViewModel中都有一个或者多个新方法),而且容易出错;很容易忘记从观察者那里调用ViewModel。...确保你用户界面与你数据状态相匹配:LiveData遵循观察者模式,当生命周期状态改变时,LiveData会通知观察者对象。你可以整合你代码来更新这些观察者对象中UI。...不会因为Activity销毁而崩溃:如果观察者生命周期处于非活动状态,例如在后堆栈中活动,那么它就不会收到任何LiveData事件。...通过使用LiveData,我们希望在代码中使用函数式编程优势,而函数式编程原则之一是使用不可变数据结构。这个原则将被Jose推荐解决方案所打破。

    1.1K10

    Android-ViewModel和LiveData使用详解

    LiveData会将观察者视为活动状态,并通知其数据变化。LiveData未注册观察对象以及非活动观察者不会收到有关更新通知。...LiveData优点: 确保UI界面的数据状态 LiveData遵循观察者模式。LiveData在生命周期状态更改时通知Observer对象,更新这些Observer对象中UI。...观察者可以在每次应用程序数据更改时更新UI,而不是每次发生更改时更新UI。 没有内存泄漏 当观察者被绑定他们对应LifeCycle以后,当页面销毁时他们会自动被移除,不会导致内存溢出。...不会因为Activity不可见导致Crash 当Activity不可见时,即使有数据变化,LiveData也不会通知观察者。...* 定义ViewModel和创建LiveData * ViewModel是以关联生命周期方式来存储和管理UI相关数据类,即使configuration发生改变(比如旋转屏幕),数据仍然可以存在不会销毁

    3.5K30

    LiveData三问—阿里真题

    主要思想就是用到了观察者模式思想,让观察者和被观察者解耦,同时还能感知到数据变化,所以一般被用到ViewModel中,ViewModel负责触发数据更新,更新会通知到LiveData,然后LiveData...再通知活跃状态观察者。...LiveData作为一种观察者模式设计思想,常常被和Rxjava一起比较,观察者模式最大好处就是事件发射上游 和 接收事件下游 互不干涉,大幅降低了互相持有的依赖关系所带来强耦合性。...其次,LiveData还能无缝衔接到MVVM架构中,主要体现在其可以感知到Activity等生命周期,这样就带来了很多好处: 不会发生内存泄漏 观察者会绑定到 Lifecycle对象,并在其关联生命周期遭到销毁后进行自我清理...不会因 Activity 停止而导致崩溃 如果观察者生命周期处于非活跃状态(如返回栈中 Activity),则它不会接收任何 LiveData 事件。

    49330

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

    既然生命周期同步如此重要,Google肯定不会视而不见,虽然自定义ObserverLifecycle可以解决这种问题,但并不是每个人都能想到。...LiveData符合标准观察者模式,所以它具备扩展性强、耦合性低特性,同样它还是一个存储数据容器,当容器数据改变时会触发观察者,即数据驱动。...observe(this, Observer { value-> textView.text = value }) //这一步会改变liveData值并且会触发textView...引入liveData后改变数据会自动触发UI渲染,将两步操作合并为一步,大大降低出错概率 关于数据驱动UI上篇文章我已经做了详细描述,感兴趣可以翻回去查看。...横竖屏切换时不会销毁对应ViewModel,为就是横竖屏能共用同一个ViewModel,从而保证数据一致性。

    83800

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

    例如:一个值可以在没有观察者活动情况下被设置,所以新观察者会直接取代它。另外,从不同线程设置值可能会导致竞赛条件,只产生一个对观察者调用。...,代码中有一些模板代码(每个事件在ViewModel中都有一个或者多个新方法),而且容易出错;很容易忘记从观察者那里调用ViewModel。...确保你用户界面与你数据状态相匹配:LiveData遵循观察者模式,当生命周期状态改变时,LiveData会通知观察者对象。你可以整合你代码来更新这些观察者对象中UI。...不会因为Activity销毁而崩溃:如果观察者生命周期处于非活动状态,例如在后堆栈中活动,那么它就不会收到任何LiveData事件。...通过使用LiveData,我们希望在代码中使用函数式编程优势,而函数式编程原则之一是使用不可变数据结构。这个原则将被Jose推荐解决方案所打破。

    1.2K10

    谷歌官方Android应用架构库——LiveData

    不同于普通观察者,LiveData 遵守应用程序组件生命周期,以便 Observer 可以指定一个其应该遵守 Lifecycle。...如果 Observer Lifecycle 处于 STARTED 或 RESUMED 状态,LiveData 会认为 Observer 处于活动状态。...这样做表示该观察者应该绑定到 Lifecycle,意思是: 如果 Lifecycle 不处于活动状态(STARTED 或 RESUMED),即使该值发生变化也不会调用观察者。...不会因为 activity 停止而崩溃:如果 Observer Lifecycle 处于闲置状态(例如:activity 在后台时),它们不会收到变更事件。...如果在调用时没有处于活动状态观察者,在添加观察者之前不会进行任何运算。 该机制允许以较少资源根据需要惰性运算来创建 LiveData。

    1.1K30

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

    三个步骤就定义了使用LiveData方式,从步骤可以看出,使用了观察者模式,当LiveData对象持有数据发生变化,会通知对它订阅所有处于活跃状态订阅者。...将LiveData解耦,不和特定Activity或Fragment绑定在一起。 创建 观察LiveData 对象 有了数据源之后,总需要有观察者来观察数据源,不然数据源就失去了存在意义。...当然,如果此时LiveData没有存储值的话,onChange()方法不会被调用。 更新 LiveData 对象 LiveData本身没有提供公共方法更新值。...通常在在ViewModel中使用MutableLiveData,而MutableLiveData暴露不可变LiveData给Observer。...当其中一个源数据发生变化是,都会回调订阅MediatorLiveData观察者onChanged()方法。例如我们在实际开发中,我们数据源要么来自服务器,要么来自本地数据库。

    3K30

    Android Jetpack - LiveData

    ,而已注册但处于非活跃状态观察者不会被更新 我们可以在实现了 LifecycleOwner 接口对象中注册 observer,这种关联允许 observer 在与之相关 Lifecycle 对象处于...每次应用程序数据更改时,你观察者都可以在每次更改时更新 UI,而不是更新 UI 没有内存泄露 观察者绑定到 Lifecycle 对象,并在其相关生命周期被破坏后自行清理 不会因为活动停止而崩溃 如果观察者生命周期处于非活动状态...,例如在后端堆栈中活动情况下,则它不会收到任何 LiveData 事件 不再需要手动处理生命周期 UI 组件只是观察相关数据,不会停止或恢复观察。...: 1、创建持有任意类型 LiveData 实例,这一步通常在 ViewModel 中完成 2、创建一个 Observer 对象并重写其 onChanged() 方法,该方法会在 LiveData 数据更改时被回调并返回最新数据...在数据变动时及时通知 Observer,这一步通常在 UI 控制器中完成 注意:你可以使用 observeForever(Observer) 方法注册没有关联 LifecycleOwner 对象观察者

    2K30
    领券