livedata 通知新观察者

livedata notifies new observer

在 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 class 中,我检查了观察者的版本是否小于 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);
}
}