【问题标题】:livedata notifies new observerlivedata 通知新的观察者
【发布时间】:2018-03-16 22:45:41
【问题描述】:

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

在给定所有者的生命周期内将给定观察者添加到观察者列表中。事件在主线程上调度。如果 LiveData 已经有数据集,则将其交付给观察者。

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

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

SingleLiveEvent 并没有完全涵盖我的情况

【问题讨论】:

  • 请留下评论,否决选民!

标签: android android-livedata


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多