【问题标题】:RealmObject changeListenerRealmObject 更改监听器
【发布时间】:2016-06-17 20:21:43
【问题描述】:

我试图从官方文档的 Notifications 部分了解 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 侦听器。

【问题讨论】:

    标签: android realm changelistener


    【解决方案1】:

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

    让 changelisteners 仅在确切的对象已更改时才通知https://github.com/realm/realm-java/issues/989

    【讨论】:

    • 感谢您的回答!我发现很多其他人都这么说,但有些人已经够老了,因为我在官方文档中读到的内容,我忽略了它们。再次感谢!
    【解决方案2】:

    使用 findFirstAsync() 返回的 realmModel 为空且无效。这就是您可以通过其 addChangeListener() 获取更新的方式

    【讨论】:

      【解决方案3】:

      现在支持特定的更改侦听器。

      official release!

      Demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        • 2010-09-08
        • 2011-07-16
        相关资源
        最近更新 更多