如果生命周期处于STARTED或RESUMED状态,LiveData会将Observer类表示的观察者视为处于活动状态。 LiveData仅通知活动观察者有关更新的信息。注册观看LiveData对象的非活动观察者未收到有关更改的通知。
这似乎并非完全正确。
使用Android Arch生命周期版本: 1.0.0
我开始注意到LiveData和Android.arch.lifecycle.Observer的触发机制在Android 7中与Android 7之前的触发机制有一个奇怪的行为。
一个简单的例子如下:
片段A具有ViewModel A.片段A观察来自ViewModel A的LiveData,称为' observableName' (串)。当ViewModel执行操作并调用observableName.value ="其他内容"时,虽然片段A仍处于活动状态(状态为STARTED),但在Android 6和7+中,一切都很好并且文本会相应更改。
这是不一致的地方:
在 Android 7 中,如果ViewModel A设置了observableName.value,而片段A的状态变为PAUSED(即启动另一个Activity),片段A的观察者onChanged()是 STILL 被调用,因此文本确实发生了变化,当片段A恢复时,文本会发生变化。
但是,在 Android 6 中,如果ViewModel A设置了observableName.value,而片段A的状态为PAUSED,则片段A的观察者onChanged()会执行 NOT 被调用,因此当片段A恢复时文本不会改变。
似乎Android 6中的行为是正确的,除了当Fragment再次变为活动状态(恢复)时,onChange仍然不会被调用。我在这里误解了似乎有两个错误(当LifecycleOwner恢复活动状态时,LifecycleOwner处于非活动状态并且未调用Android 6观察者时调用Android 7观察者)?
注意:当ViewModel A异步执行操作时(即从API获取结果并在之后更新LiveData的值,而LifecycleOwner转换为非活动状态时)会发生这种情况。
任何遇到类似行为的人?
更新1:经过一些调试后,我发现在类LifecycleRegistry
中,当LifecycleOwner(片段A)的状态发生变化时,ObserverWithState#dispatchEvent
方法被多次调用。问题似乎是,在Android 7中,dispatchEvent()
永远不会收到Event = ON_STOP
,就像在Android 6中一样,尽管片段A的onStop()
永远不会在Android 6和7.这可能会导致片段A中的onChange()
在Android 6中暂停后不再接收事件。
在片段A暂停时设置LiveData值之前,可以通过调用Android 7中的LiveData#hasActiveObservers
和Android 6中的true
轻松检查false
。