当前位置: 首页 > 知识库问答 >
问题:

LiveData上的观察者在removeObservers之后仍然活动

端木令
2023-03-14

我使用LiveData从DB中选择信息,并将其传递给我的活动(通过DAO、Repository&Viewmodel),依赖于一段时间的日期。当我更改timespan时,我希望删除LiveData上的旧观察者,并为新的timespan创建新的观察者。

private void addStepsObserver(Date[] timeSpan) {
    homeViewModel.getSteps(timeSpan[0], timeSpan[1]).observe(this, new Observer<Integer>() {
        @Override
        public void onChanged(Integer integer) {
            if (integer == null) {
                return;
            }
            Log.i(StepRepository.TAG, "onChanged for getSteps().observe called " + integer);
            updateStepCounter(integer);
        }
    });
}

private void removeObservers() {
    Date[] timeSpan = homeViewModel.getCurrentTimespan();
    homeViewModel.getSteps(timeSpan[0], timeSpan[1]).removeObservers(this);
    Log.i(TAG, "remove Observers " + timeSpan[0] + " " + timeSpan[1]);
}

但是,在调用RemoveObservers()AddStepsObServers(timespan)(其中timespan是之前的另一个时间戳)之后,两个观察器都调用了UpdateStepCounter()方法,尽管旧的方法不再活动(我使用.hasObservers().hasActiveObservers()检查了这一点)

有什么建议吗?

共有1个答案

太叔鸿博
2023-03-14

HomeViewModel.getSteps()-为每个调用返回新的LiveData?因此,这意味着您从另一个新创建的LiveData中删除一个观察者。您必须保留对在AddStepSobServer步骤中创建的LiveData对象的引用,并且在RemoveObserver步骤中,您应该从中删除观察者。

 类似资料:
  • 在我正在工作的一个项目中,我使用了paginglibrary和Reverfit。这是我第一次这么做。 数据正常返回。但是我注意到我的viewmodel(更确切地说是我的LiveData)中的观察者在我的PageKeyedDataSource中的LoadIsitial回调之前被调用。这将使传递给适配器的列表为空。为什么在我回调之前调用Observer?

  • 问题内容: 我有以下代码要使用。 尽管这似乎可行,但以下部分是什么意思? 这必须导致对象符合符合以下条件的Observer接口: 如何 结果对象与onChanged方法? 我不知道将接口名称放在lambda表达式前面意味着什么。 谢谢! 问题答案: 这称为SAM转换,该概念有助于与示例中的Java 单一抽象方法接口进行交互。 以下代码创建的实现,其中单个抽象方法是: 另外,但更冗长的是使用obje

  • 在livedata的observe方法中有这样一条评论 在给定所有者的生命周期内将给定的观察者添加到观察者列表中。事件在主线程上分派。如果LiveData已经有数据集,它将传递给观察者。 当我尝试向现有livedata实例添加新的观察者时,如果livedata具有数据集,则new观察者的onChanged方法调用。 有什么办法可以避免这种行为吗?我只是不想被通知新的观察员 SingleLiveEv

  • 如何在收到第一个结果后移除观察者?下面是我尝试过的两种代码方式,但它们都不断接收更新,即使我已经删除了观察者。

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?