gpt4 book ai didi

android - 可变实时数据集值 : Unexpected behavior in Activity's onCreate

转载 作者:行者123 更新时间:2023-12-02 12:08:45 27 4
gpt4 key购买 nike

我正在研究 MutableLiveData 的方法来找出什么触发观察者,什么不会。

现在,我有这个 Activity :

class ActivityA : AppCompatActivity() {
private val liveData = MutableLiveData<Int>().apply { this.value = 10 }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
liveData.observe(this, Observer {
Log.v("ActivityA", "liveData = $it")
})
Log.v("ActivityA", "liveData = ${liveData.value}")
liveData.value = 11
liveData.postValue(12)
liveData.value = 13
}
}

输出如下:

liveData = 10
liveData = 13
liveData = 12

不应该是这个吗?

liveData = 10
liveData = 11
liveData = 13
liveData = 12

最佳答案

您的问题是livedata observer未激活。因此,当您执行 liveData.value = 11 时,该值不会发布到观察者。随后,当您执行 liveData.value = 13 时,它会覆盖值 11。

要检查您的实时数据是否有任何活跃的观察者,您可以执行liveData.hasActiveObservers()

文档明确指出 setValue 仅在存在任何 Activity 观察者时调度

void setValue (T value)

Sets the value. If there are active observers, the value will be dispatched to them.

但是为什么你的观察者不活跃?

当您设置值时,LiveData 在内部使用 ObserverWrappershouldBeActive 方法来检查特定观察者是否处于 Activity 状态。

当您使用observe方法注册您的观察者时,观察者被包装在LifecycleBoundObserver中( ObserverWrapper 的子类),其定义其 shouldBeActive 如下。

@Override
boolean shouldBeActive() {
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}

重要的部分是 .isAtLeast(STARTED),这里 STARTED 的类型为 Lifecycle.State ,其文档对此有以下说明。

Started state for a LifecycleOwner. For an Activity, this state is reached in two cases:

after onStart call;

right before onPause call.

并且由于您在 onCreate 中注册了 observer,它不会立即变为 Activity 状态,因此会出现问题。

为了进行验证,您还可以使用observeForever(请阅读其文档,它与observe有很大不同) 方法来注册您的观察者。因为此方法使观察者立即 Activity ,所以您将看到您期望的输出。

liveData.observeForever {
Log.v("ActivityA", "liveData = $it")
}

关于android - 可变实时数据集值 : Unexpected behavior in Activity's onCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60005160/

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