RealmObject变化监听器

3

我正在尝试从官方文档的通知部分了解Realm中的通知类型,当我在多个受管理的对象中使用RealmObject addChangeListener时,只有一个对象发生更改时,所有对象都会被调用。

这是我的代码

Person first = realm.where(Person.class).equalTo("id", 0).findFirst();

first.addChangeListener(new RealmChangeListener<Person>() {
    @Override
    public void onChange(Person person) {
        Log.e(LOG_TAG, "First element is changing: " + person);
    }
});

Person second = realm.where(Person.class).equalTo("id", 1).findFirst();

second.addChangeListener(new RealmChangeListener<Person>() {
    @Override
    public void onChange(Person person) {
        Log.e(LOG_TAG, "Second person is changing: " + person);
    }
});

当我在任何一个Person对象中触发更新时(例如在第一个对象中),这两个监听器都会被调用。
官方文档如下所述:
监听器也可以附加到RealmObject实例以及RealmResults实例。这允许您对对象和查询结果的更改做出反应。
还有:
最后,基于类型的更改侦听器将在引用的类型更改时收到通知。
从我理解的情况来看,这种行为符合第二个定义,但我需要使用第一种行为,也就是说,当更改与该侦听器对应的对象时,我想要收到通知。因此,如果更新第一个Person对象,则只有其对应的监听器会收到通知,而不是所有Person监听器。
3个回答

3

现在发生这种情况是因为我们的变更检测不够精细。它会触发相同类型的所有对象的更改监听器,而不仅仅是那些已更改的对象。

要使更改侦听器仅在确切对象更改时发出通知,请参见此处https://github.com/realm/realm-java/issues/989


谢谢你的回答!我发现很多其他人也这么说,但有些是旧的,所以我忽略了它们,因为我在官方文档中读到了一些信息。再次感谢! - undefined

1
使用findFirstAsync()方法返回一个空且无效的realmModel。这样你就能通过addChangeListener()方法获取更新了。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接