gpt4 book ai didi

android - livedata 通知新观察者

转载 作者:搜寻专家 更新时间:2023-11-01 09:28:22 25 4
gpt4 key购买 nike

在 livedata 的 observe 方法中有这样的注释

Adds the given observer to the observers list within the lifespan of the given owner. The events are dispatched on the main thread. If LiveData already has data set, it will be delivered to the observer.

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

有没有办法避免这种行为?我只是不想收到新观察员的通知

SingleLiveEvent 没有完全涵盖我的情况

最佳答案

由于 LiveData 从其默认版本 -1 开始观察者版本,因此新观察者会收到先前 livedata 值更改的通知。这里是livedata的ObserverWrapperClass

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

关于android - livedata 通知新观察者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49330470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com