LiveData 观察两次而不是一次

时间:2021-05-03 14:09:42

标签: kotlin android-livedata

我在我的应用程序中使用 MVVM 作为架构,但我在观察者代码中看到了一个意想不到的场景:在观察者内部总是在获得实际值之前进入一次。

myViewModel.getUserInfo().observe(this, androidx.lifecycle.Observer { user ->
        if (user!= null) {

        } else {
            //THE FIRST TIME THROW HERE
        }

在我的 viewModel 中,我有这个:

class MyViewModel : ViewModel() {

    fun getUserInfo(): MutableLiveData<UserInfoResponse> {

        val liveData: MutableLiveData<UserInfoResponse> = MutableLiveData()
        liveData.postValue(UserInfoResponse("user"))
       
        return liveData
    }

有人能想到正在发生的事情吗? 谢谢

1 个答案:

答案 0 :(得分:0)

postValue()

<块引用>

将任务发布到主线程以设置给定值。因此,如果您在主线程中执行了以下代码:

 liveData.postValue("a");
 liveData.setValue("b");
<块引用>

首先设置值“b”,然后主线程将用值“a”覆盖它。 如果在主线程执行已发布的任务之前多次调用此方法,则只会调度最后一个值。

猜测,您在返回 LiveData 之前发布了该值,但它实际上是 set after观察者已被添加并收到第一个值。当这种情况发生时,观察者将再次使用第二个发布的值被调用。

您已经提到添加和删除片段,并且我假设它们使用相同的 ViewModel,因此当他们开始观察 LiveData 时,它已经具有之前设置的值,并且观察者立即收到。 posted 值稍后出现。