在Nougat +和较低的API级别中使用LiveData的行为不一致

时间:2018-01-21 06:42:35

标签: android mvvm android-livedata

根据documentation

  

如果生命周期处于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

0 个答案:

没有答案