简体   繁体   English

在 removeObservers 之后 LiveData 上的观察者仍然处于活动状态

[英]Observer on LiveData still active after removeObservers

I select Information from DB using LiveData, passing it to my Activity (via DAO, Repository & Viewmodel) dependent from a timespan of Dates.我使用 LiveData 从 DB 中选择信息,将其传递给我的 Activity(通过 DAO、Repository 和 Viewmodel)依赖于日期的时间跨度。 When I change the timespan, I want to remove the old Observers on the LiveData and create new Observer for the new Timespan.当我更改时间跨度时,我想删除 LiveData 上的旧观察者并为新的时间跨度创建新的观察者。

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]);
}

However, after I call removeObservers() and then addStepsObservers(timespan) with timespan being another timestamp than before, the method updateStepCounter() is called by both observers, although the old one isn't active anymore (I checked that using .hasObservers() and .hasActiveObservers() )但是,在我调用removeObservers()然后addStepsObservers(timespan) removeObservers()并且addStepsObservers(timespan)跨度是另一个时间戳之后,两个观察者都调用了updateStepCounter()方法,尽管旧的不再活动(我使用.hasObservers().hasActiveObservers() )

Any advices?有什么建议吗?

homeViewModel.getSteps() - returns a new LiveData for each call? homeViewModel.getSteps() - 为每次调用返回一个新的LiveData So, it means that you remove an observer from another newly created LiveData .因此,这意味着您从另一个新创建的LiveData删除了一个观察者。 You have to keep a reference to LiveData object created in addStepsObserver step and in removeObservers step you should remove observers from it.您必须保留对在addStepsObserver步骤和removeObservers步骤中创建的LiveData对象的引用,您应该从中删除观察者。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM