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 = 13
它 overrides
值 11.
要检查您的实时数据是否有任何活跃的观察者,您可以liveData.hasActiveObservers()
文档明确指出 setValue
只有在有任何活跃的观察者时才会调度
void setValue (T value)
Sets the value. If there are active observers, the value will be
dispatched to them.
但是为什么你的观察者不活跃呢?
设置值时,LiveData
在内部使用 ObserverWrapper
的 shouldBeActive
方法检查特定观察者是否处于活动状态。
并且当您使用 observe
方法注册您的 observer
时,observer
被包装在 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
,它不会立即激活,因此出现了问题。
验证你也可以使用observeForever
(请阅读它的文档,它与observe
[=70有很大的不同=]) 方法来注册您的 observer
。因为此方法立即使 observer
active
,您将看到您期望的输出。
liveData.observeForever {
Log.v("ActivityA", "liveData = $it")
}
我正在研究 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 = 13
它 overrides
值 11.
要检查您的实时数据是否有任何活跃的观察者,您可以liveData.hasActiveObservers()
文档明确指出 setValue
只有在有任何活跃的观察者时才会调度
void setValue (T value)
Sets the value. If there are active observers, the value will be dispatched to them.
但是为什么你的观察者不活跃呢?
设置值时,LiveData
在内部使用 ObserverWrapper
的 shouldBeActive
方法检查特定观察者是否处于活动状态。
并且当您使用 observe
方法注册您的 observer
时,observer
被包装在 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
,它不会立即激活,因此出现了问题。
验证你也可以使用observeForever
(请阅读它的文档,它与observe
[=70有很大的不同=]) 方法来注册您的 observer
。因为此方法立即使 observer
active
,您将看到您期望的输出。
liveData.observeForever {
Log.v("ActivityA", "liveData = $it")
}