- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在 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/
AngularFire2 文档演示了以下将观察者绑定(bind)到您的 Firebase 可观察对象的模式: this.item = af.database.object('/item'); {{ (
我正在使用观察者模式和 BlockingQueue 添加一些实例。现在在另一种方法中,我正在使用队列,但似乎 take() 一直在等待,即使我这样做: /** {@inheritDoc} */ @Ov
我遇到问题 - 创建具有不同属性的订单。在我的工作案例中,用户有大约 10 个不同的属性,每个属性有 3-4 个变体。 我正在使用 Angular js,并编写了两个函数: 二传手 $scope
我尝试将额外的产品添加到购物车。我为此创建了一个观察者。 getEvent()->getControllerAction()->getFullActionName() == 'checkout_car
我尝试将额外的产品添加到购物车。我为此创建了一个观察者。 getEvent()->getControllerAction()->getFullActionName() == 'checkout_car
假设我想创建一组基于类型的观察者。也就是说,当他们收到事件通知时,他们会被告知其中一个参数的类型,然后根据是否可以对该类型进行操作来决定是否采取行动。 有没有简单的方法可以做到这一点?我认为这对于泛型
快速提问。 当 setChanged() 和 notifyObservers() 被调用并且 Observer.update() 运行时,它是否在一个新的 Thread,还是在同一个Thread中?
我必须为可观察对象和观察者创建代码。正如您所知,每个观察者都有自己的“更新”方法。 在我的可观察代码中,我使用了“notifyObservers”方法。它的参数是一个字符串数组,其中包含有关我的项目的
是否有一种设计模式可以形成“复合”观察者/可观察对象? 我的意思是我有一个可观察的 A 通知它的听众一些变化。 每个监听器也是一个可观察对象,并通知自己的监听器(在它执行的某些操作中,哪个操作是由第一
我对以下代码为何不起作用感到有点困惑: MutableLiveData mutableTest = new MutableLiveData<>(); MediatorLiveData mediator
场景:我有两个名为 FirstFragment 的 fragment 和 UnitFragment .我来自 FirstFragment至UnitFragment选择一个单位返回FirstFragme
我想了解如何 平面 map 作品。我知道这是处理 Observable> 的一种方式。 无论如何,我正在测试它的行为并陷入困境: let plusDom = document.querySelecto
我有 public class mammal implements Imammle { public String getName() { return "Mammal";
如果我使用 KVO 来观察我的播放器项目,如下所示: AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:url];
我想在正在使用的变量上使用观察者,这是我的代码: const get = Ember.get; uploader:Ember.inject.service('uploader'), progressC
我一直在使用Laravel Observers每当我的模型被删除/更新/保存时处理我的应用程序逻辑。我注意到在某些情况下这些观察者不会被触发。例如,如果我使用 Model::where(active,
我有一个工作人员服务来发送一些简单的通知。但现在,我想在发送之前检查数据库中的一些数据。 但是,我不能在工作线程中使用观察者,它必须在主线程中。我有一个错误类型 java.lang.IllegalSt
我有 2 个字段:美元和日元。当我更改美元字段时,我想在日元字段中显示转换后的数字,反之亦然。 我的问题是这样的: 如果我有 2 个带有观察者的字段,例如: addTextChangedListene
在 View Controller 中,我创建了一个 subview 数组,可以随时从父 View 中删除,因此它们的生命周期比 View Controller 的生命周期短。 创建它们时,我几乎这样
如何在另一个线程上运行 RxJava,因为主线程上的工作太多。 我在一个方法内运行观察者,下面是代码 fragment : public void updatePie() { RxJavaPlugin
我是一名优秀的程序员,十分优秀!