MutableLiveData setValue:Activity 的 onCreate 中出现意外行为

MutableLiveData setValue: Unexpected behavior in Activity's onCreate

我正在研究 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 时,此值不会发布到 observer。 然后当你做 liveData.value = 13overrides 值 11.

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

文档明确指出 setValue 只有在有任何活跃的观察者时才会调度

void setValue (T value)

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

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

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

并且当您使用 observe 方法注册您的 observer 时,observer 被包装在 LifecycleBoundObserverObserverWrapper 的子类)中,它定义其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,它不会立即激活,因此出现了问题。

验证你也可以使用observeForever请阅读它的文档,它与observe[=70有很大的不同=]) 方法来注册您的 observer。因为此方法立即使 observer active,您将看到您期望的输出。

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