![](/img/trans.png)
[英]How to create LiveData which emits a single event and notifies only last subscribed observer?
[英]livedata notifies new observer
在livedata的observe方法中,有一条评论,如
在给定所有者的生命周期内将给定观察者添加到观察者列表中。 事件在主线程上调度。 如果 LiveData 已经有数据集,它将被传递给观察者。
当我尝试向现有 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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.