Android LiveData,ViewModel,无法添加具有不同生命周期的相同观察者

标签 android viewmodel android-livedata

我是 android 架构组件的新手,并尝试在我的 Activity 和 MyLifecycleService 中使用 LiveData,但有时应用程序崩溃了

IllegalArgumentException: Cannot add the same observer with different lifecycles

这是我的服务代码

 private final MutableLiveData<SocketStatus> socketStatusMutableLiveData = OrderRxRepository.Companion.getInstance().getMldSocketStatus(); 
 socketStatusMutableLiveData.observe(this, socketStatus -> {
        if (socketStatus == null) return;
        ...
    });

对于我的 Activity ,我有一个包含相同实时数据的 activityViewModel 类,这是代码

class MyActivityViewModel: ViewModel() {
val socketStatusMutableLiveData = OrderRxRepository.instance.mldSocketStatus
}

以及我 Activity 中的代码

MyActivityViewModel viewModel = ViewModelProviders.of(this).get(MyActivityViewModel .class);
viewModel.getSocketStatusMutableLiveData().observe(this, socketStatus -> {
        if (socketStatus == null) return;
        ...
    });

最佳答案

tl;dr 您不能用两个不同的 LifecycleOwner 调用 LiveData.observe()。在您的情况下,您的 Activity 是一个 LifecycleOwner,另一个是您的服务。

从 Android 的源代码中你可以看到,如果已经有一个 LifecyclerOwner 观察并且 LifecyclerOwner 与你试图观察的那个不同,就会抛出这个异常.

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
    ...
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    if (existing != null && !existing.isAttachedTo(owner)) {
        throw new IllegalArgumentException("Cannot add the same observer"
                + " with different lifecycles");
    }
    ...
}

这解释了为什么您会遇到此问题,因为您正试图通过一个 Activity (一个 LifecycleOwner)和一个服务(一个不同的 LifecycleOwner)观察同一个 LiveData >).

更大的问题是您正试图将 LiveData 用于它不应该做的事情。 LiveData 用于保存单个 LifecycleOwner 的数据,而您试图让它保存多个 LifecycleOwner 的数据。

对于您尝试使用 LiveData 解决的问题,您应该考虑其他解决方案。根据您的需要,这里有一些替代方案:

  • Global singleton - 如果您想将一些数据保存在内存中并在您的应用程序的任何地方都可以访问它,这是非常好的。如果您希望数据“可观察”,请将其与 Rx 一起使用
  • LocalBroadcastManager - 如果您想在您的服务和 Activity 之间进行通信,那就太好了
  • Intent - 如果您还想在服务完成后确保您的 Activity 仍然存在,那就太好了

关于Android LiveData,ViewModel,无法添加具有不同生命周期的相同观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52698113/

相关文章:

android - 将 achartengine 的 donutchartview 添加到线性布局时出现 IndexOutOfBoundsException

asp.net-mvc - 文件上传绑定(bind)到Viewmodel

c# - 验证不适用于 ViewModel

android - 使用数据绑定(bind)时 SwipeRefreshLayout 进度不隐藏

java - 在不观察的情况下从房间中选择数据

android - 如何从 2 个 View 模型更新 1 个回收器 View 适配器?

android - SQLite在Kotlin和Anko中的实现

android - ssh动态端口转发

android - 如何将阿拉伯语设置为语言环境

c# - 如何在MVVM Light中调用另一个 View 模型构造函数