【问题标题】:LiveData observes twice instead of only oneLiveData 观察两次而不是一次
【发布时间】:2021-05-03 14:09:42
【问题描述】:

我在我的应用程序中使用 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
    }

谁能知道正在发生的事情? 谢谢

【问题讨论】:

  • 你可以试试吗? observe(viewLifeCycleOwner) { user -&gt; } ?
  • 我得到了同样的结果。
  • 这就是异步的工作原理,也是预期的行为

标签: kotlin android-livedata


【解决方案1】:

postValue()

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

 liveData.postValue("a");
 liveData.setValue("b");

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

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

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

【讨论】:

  • 感谢您的解释,它让我明白了很多。无论如何,ViewModel 中的方法被调用了两次。是否有可能在创建(注入)ViewModel 时调用了该方法?
  • 你的意思是getUserInfo() 被调用了两次?您显示它被调用的唯一地方是当您设置该观察者时 - 您必须查看从哪里调用它(将光标放在它上面并在菜单中按 Alt+F7/Find Usages ) 并检查它没有发生超出预期的情况
  • 是的,这是我的问题。我只调用它一次,因此我认为当我替换 Fragment 而不是添加它时问题就来了。所以每次替换时都会调用ViewModel中的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多