当前位置: 首页 > 知识库问答 >
问题:

怪异的AndroidViewModel LiveData观察者行为

任文乐
2023-03-14

我之所以说怪异,是因为我不明白有人可能会告诉我什么在按预期工作。

我有一个带有LiveData成员的Android ViewModel,我在Main活动中观察到它来切换一些代码功能。LiveData对象在视图模型的构造函数中被分配初始值。

从理论上讲,一切都很好,只是在安装后第一次启动应用程序和随后启动应用程序之间,观察者的行为会发生变化。

在安装后的第一次启动期间,在我设置好观察者之后,它们会立即被触发,而不会更改底层的LiveData对象。

在随后的应用程序启动过程中,观察员不会在安装后过早触发,而是在我更改应用程序其他地方的值时触发,这就是我预期的情况。

起初,我认为观察者不知何故从LiveData初始化中获得了延迟触发,但如果这是真的,那么无论是安装后的第一次运行还是后续启动,都应该发生。

因此,为了让应用程序按预期运行,我必须在观察者中使用哨兵,以防止他们在安装后第一次运行应用程序时在第一次触发期间运行。

有人能解释为什么会发生这种情况吗?如果它是预期的功能,我不相信,请给我指一下解释这种情况的文档?

我觉得我又在攻击Android了。

下面是一些人们总是要求的代码片段,从LiveData声明开始。

@NonNull
private final MutableLiveData<Boolean> consentRequired = new MutableLiveData<>();

ViewModel构造函数初始化

    setConsentRequired(false);

ViewModel getter/setter

@NonNull
public LiveData<Boolean> getConsentRequired()
{
    return consentRequired;
}
@NonNull
public void setConsentRequired(@NonNull Boolean consentRequired)
{
    this.consentRequired.setValue(consentRequired);
}

观察员

    getViewModel().getConsentRequired().observe(this, item ->
    {
        if (sentryAllowsObserverToRun)
        {
            // Do the observer stuff here
        }
    }

我必须设置一个布尔值,声明这不是安装后第一个应用程序启动的第一个触发器。

共有1个答案

宰父飞翼
2023-03-14

问题的答案保存在本说明中:

... 观察者从非活动状态更改为活动状态时,也会收到更新。此外,如果观察者第二次从非活动状态变为活动状态,则仅当值自上次变为活动状态以来发生了变化时,它才会收到更新。

在您的情况下,approvementRequired拥有新数据(在vm构造函数中分配),当您的MainActivity开始观察数据并变为活动时,approvementRequiredMainActivity交付数据
要解决这个问题,您必须避免将临时初始数据设置为LiveData

我想,“关闭应用程序”实际上是指“最小化应用程序”。在这种情况下,应用程序进程保持活跃,活动进入后台状态。直到活动保留在Backtack中,视图模型也保留在内存中。当你“重新打开应用程序”时,活动返回前台状态,但是留档说:

此外,如果观察者第二次从非活动状态变为活动状态,则仅当值自上次变为活动状态以来发生了变化时,它才会收到更新。

这会导致:当活动仍处于backstack状态且LiveData的值保持不变时,它将不会接收数据。

您可以在文档的Observe LiveData objects一段中通过示例阅读详细说明。

 类似资料:
  • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

  • 我们支持使用分布式消息系统,例如 etcd 来保持多个Casbin执行器实例之间的一致性。 因此,我们的用户可以同时使用多个Casbin 执行器来处理大量的权限检查请求。 与策略存储 adapters类似,我们没有把watcher的代码放在主库中。 任何对新消息系统的支持都应该作为watcher程序来实现。 完整的Casbin watchers列表如下所示。 欢迎任何第三方对 watcher 进行

  • ORM类底层提供了Observer支持,可以在数据更新、删除、插入时通知观察者。 $user1 = Model('User')->get(1); $user1->attach(new \App\Observer\UserUpdate()); $user->mobile = '18948735886'; $user->save(); 观察者类 namespace App\Observer; cl

  • 什么是观察者? - 观察者是由 Observable 发送的值的消费者。观察者只是一组回调函数的集合,每个回调函数对应一种 Observable 发送的通知类型:next、error 和 complete 。下面的示例是一个典型的观察者对象: var observer = { next: x => console.log('Observer got a next value: ' + x),

  • 是否有一种设计模式可以形成一个“复合”观察者/可观察者? 我的意思是我有一个可观察的,它在某个变化时通知它的监听器。 每个监听器也是一个可观察的,并通知它自己的监听器(在某个动作上,它做了哪个动作是由第一个可观察的通知触发的)。 这种观察者/可观察的“链接”作为设计是可以的,还是有一个标准的模式?

  • 我正在学习RxJS,对于“听众”在哪里(在可观察的或观察者中),他们是如何订阅/取消订阅的,以及当观察者“不再对”可观察的“不感兴趣”时会发生什么,比如当你使用或。 对于第一部分——什么是订阅什么,什么是倾听者——我对这些陈述之间看似矛盾的地方感到困惑。从http://reactivex.io/rxjs/manual/overview.html我们读到观察者不是观察者的“听众” 这与addEven