在livedata的observe方法中有这样一条评论
在给定所有者的生命周期内将给定的观察者添加到观察者列表中。事件在主线程上分派。如果LiveData已经有数据集,它将传递给观察者。
当我尝试向现有livedata实例添加新的观察者时,如果livedata具有数据集,则new观察者的onChanged方法调用。
有什么办法可以避免这种行为吗?我只是不想被通知新的观察员
SingleLiveEvent没有完全报道我的案子
由于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