我现在正在使用最新的 Android 架构组件,尤其是 ViewModel 和 LiveData。
我的情况是此处建议的SingleLiveEvent是相关的,即我返回一个错误并且我只想显示一次警报。在向 Activity 发出值之前,我需要将我的错误映射到更适合视图的对象。我为此使用了转换。
所以最后,我有一个看起来像这样的 ViewModel:
public LiveData<ViewState> getStateForView() {
final LiveData<NetworkState> liveState = myRepository.getState();
return Transformations.map(liveState, myMapper::map);
}
在我的存储库中,我在哪里使用 SingleLiveEvent:
public LiveData<NetworkState> getState() {
myNetworkState = new SingleLiveEvent<>();
return myNetworkState;
}
这工作得很好,但我注意到当方向多次更改时,我的事件并没有一直传播。在调试时,我注意到观察者注册和移除之间没有对称性:
- 在注册时,我的 SingleLiveEvent 的观察者是我 SingleLiveEvent 中的匿名观察者类
- 在删除时,要从我的 SingleLiveEvent 中删除的观察者是 MediatorLiveData(实际上是在观察我的 SingleLiveEvent 中的早期匿名类)
发生的情况是,我的初始观察者永远不会从 SingleLiveEvent 的观察者中移除(因此,如果方向更改多次,我的 SingleLiveEvent 有多个观察者)。
我无法弄清楚为什么在移除时这不是同一个观察者。在没有转换步骤的情况下复制它时,不存在这样的问题。
有没有人暗示过这种行为?SingleLiveEvent(不是框架的一部分)和转换不应该一起工作吗?