【问题标题】:MutableLiveData setValue: Unexpected behavior in Activity's onCreateMutableLiveData setValue:Activity 的 onCreate 中的意外行为
【发布时间】:2020-02-06 04:45:05
【问题描述】:

我正在玩弄 MutableLiveData 的方法来确定什么触发了观察者,什么不触发。

现在,我有这个活动:

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

【问题讨论】:

标签: android kotlin android-lifecycle


【解决方案1】:

您的问题是 livedata observer 未激活。因此,当您执行liveData.value = 11 时,此值不会发布到observer。 然后当你做liveData.value = 13overrides值11。

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

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

void setValue(T值)

设置值。 如果有活跃的观察者,的值将是 发送给他们。

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

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

当您使用observe 方法注册您的observer 时,observer 被包裹在LifecycleBoundObserverObserverWrapper 的子类)中,该shouldBeActive 定义如下。

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

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

LifecycleOwner 的启动状态。对于一个 Activity,这个状态是 在两种情况下达到:

onStart 调用后;

就在 onPause 调用之前。

因为您在onCreate 中注册了observer,所以它不会立即激活,因此会出现问题。

对于验证,您还可以使用observeForever请阅读其文档,它与observe)方法来注册您的observer。因为这种方法会立即生成observer active,所以您将看到您期望的输出。

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

【讨论】:

  • 这仍然奇怪的是,如果您删除 postValue(12)setValue = 13,那么它将打印 11,因此当您执行 setValue = 11 时它确实有一个观察者,但前提是你不postValue(12)
  • 其实这是有道理的,它只是在它获得一个活跃的观察者之前被超越,但是当它设置为 11 时观察者是不活跃的,你是对的
  • 是的,观察者只有在生命周期开始时才会激活。
猜你喜欢
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2020-10-04
  • 2016-07-16
  • 2016-05-10
  • 2020-07-23
  • 2021-08-23
相关资源
最近更新 更多