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

livedata通知新的观察者

周威
2023-03-14

在livedata的observe方法中有这样一条评论

在给定所有者的生命周期内将给定的观察者添加到观察者列表中。事件在主线程上分派。如果LiveData已经有数据集,它将传递给观察者。

当我尝试向现有livedata实例添加新的观察者时,如果livedata具有数据集,则new观察者的onChanged方法调用。

有什么办法可以避免这种行为吗?我只是不想被通知新的观察员

SingleLiveEvent没有完全报道我的案子

共有1个答案

许淳
2023-03-14

由于LiveData从其默认版本-1启动了Observators版本,因此新的观察者会从之前的LiveData值更改中获得通知。下面是livedata的ObserverWrapper类

private abstract class ObserverWrapper {
    final Observer<T> mObserver;
    boolean mActive;
    int mLastVersion = START_VERSION;

    ObserverWrapper(Observer<T> observer) {
        mObserver = observer;
    }

    abstract boolean shouldBeActive();

    ...rest of class ...
    }

相反,我创建了定制的ObserverWrapper,并从livedata的上一个版本启动了新的观察者。

public class MyObserverWrapper<T> {
final Observer<T> observer;
int lastVersion;

public MyObserverWrapper(Observer<T> observer, int version) {
    this.observer = observer;
    lastVersion = version;
}
}

在我的自定义livedata类中,我检查了观察者的版本是否小于livedata的版本。如果是这样,我通知了观察者。

public class SingleLiveEvent<T> extends MutableLiveData<T> {

public int version;
private MyObserverWrapper observerWrapper;
private Map<String, MyObserverWrapper> observerWrapperMap = new HashMap<>();

public void observe(LifecycleOwner owner, MyObserverWrapper observerWrapper) {
    observerWrapperMap.put(owner.getClass().getName(), observerWrapper);
    observe(owner, observerWrapper.observer);
}

@MainThread
public void observe(final LifecycleOwner owner, final Observer<T> observer) {

    // Observe the internal MutableLiveData
    super.observe(owner, new Observer<T>() {
        @Override
        public void onChanged(@Nullable T t) {
            for (String lifecycleOwnerName : observerWrapperMap.keySet()) {
                if (lifecycleOwnerName.equals(owner.getClass().getName())) {
                    observerWrapper = observerWrapperMap.get(lifecycleOwnerName);
                    break;
                }
            }
            if (observerWrapper.lastVersion < version) {
                observer.onChanged(t);
            }
        }
    });
}

@MainThread
public void setValue(@Nullable T t) {
    version++;
    super.setValue(t);
}
}
 类似资料:
  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 当项目添加到LiveData列表时,我需要获得一个Observer事件。但据我所知,只有当我用新列表替换旧列表时,事件才会收到。例如,当我执行下一个操作时: 观察者获取事件。但当我将项目添加到值中时,观察者是沉默的。你能给我一些建议吗?

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 作为前言,我已经有了一个片段,它以与下面相同的方式观察LiveData,并且它工作得很好。出于某种原因,当试图使用服务作为生命周期所有者时,我认为这会导致一个问题,并且没有调用观察者。 我已经在这里检查了答案,但由于我使用的是相同的ViewModel/DAO实例,这不应该是我的问题。(我想?如果我错了请纠正我。) 我有一个从MattCarroll的Hover扩展HoverMenuService的服

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