gpt4 book ai didi

android - 奇怪的 AndroidViewModel LiveData 观察者行为

转载 作者:行者123 更新时间:2023-12-03 21:18:33 24 4
gpt4 key购买 nike

我说很奇怪,因为我不明白有人可能会告诉我什么正在按预期工作。

我有一个带有 LiveData 成员的 AndroidViewModel,我在 MainActivity 中观察到这些成员来切换一些代码功能。 LiveData 对象在 View 模型的构造函数中分配了初始值。

理论上一切正常,除了观察者的行为在安装后第一次启动应用程序和随后的应用程序启动之间发生变化。

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

在应用程序的后续启动期间,观察者不会在设置后过早触发,而是仅在我更改应用程序其他地方的值时触发,这是我期望发生的。

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

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

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

我觉得我又在破解安卓了。

以下是人们总是要求的一些代码 fragment ,从 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
}
}

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

最佳答案

问题的答案在本说明中:

... observers also receive an update when they change from an inactive to an active state. Furthermore, if the observer changes from inactive to active a second time, it only receives an update if the value has changed since the last time it became active.



在你的情况下 consentRequired有新数据(在 vm 构造函数中分配)并且当你的 MainActivity开始观察数据并激活, consentRequired将数据发送到 MainActivity .
要解决它,您需要避免将临时初始数据设置为 LiveData。 .

我想,“关闭应用程序”实际上是指“最小化应用程序”。在这种情况下,应用程序进程保持 Activity 状态,并且 Activity 进入后台状态。直到 Activity 保持在回溯中, View 模型也保持在内存中。当您“重新打开应用程序”时, Activity 返回前台状态,但文档说:

Furthermore, if the observer changes from inactive to active a second time, it only receives an update if the value has changed since the last time it became active.



这会导致:当您的 Activity 保留在 backstack 和 LiveData 中时,它不会接收到数据。的值保持不变。

您可以阅读 Observe LiveData objects 中的示例详细说明文件的段落。

关于android - 奇怪的 AndroidViewModel LiveData 观察者行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52950945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com