首页 > 解决方案 > Realm Java 排序使 changelistener 变慢

问题描述

当我有一个包含更多元素(大约 7000 个)的列表并且我向查询添加排序时,更改侦听器变得非常慢。当只给出一个字段时,情况并非如此。从第二个领域开始,它慢了很多。它似乎还取决于排序的字段类型。布尔值似乎相当快。仅使用一个时,日期也会变慢。

让我向您展示我的工作:对具有多个排序元素的所有对象进行非常简单的查询:

val theList = realm.where(TheObject::class.java)
    .sort(
        arrayOf("fieldBool", "fieldDate", "fieldString"),
        arrayOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
    )
    .findAllAsync()

theList.addChangeListener { result: RealmResults<TheObject> ->
    // Set the list to the view.
}

现在,当此结果列表中的某个对象发生更改时,更改侦听器需要大量时间来更新数据。同一个looper上的其他变化监听器也很慢。

即使我在添加 changeListener (在更改 lsitener 中)后对结果进行排序:

val theList = realm.where(TheObject::class.java)
    .findAllAsync()

theList.addChangeListener { result: RealmResults<TheObject> ->
    viewToSet.list = result.sort(
        arrayOf("fieldBool", "fieldDate", "fieldString"),
        arrayOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
    )
}

更新发生得很慢。我发现它可能与计算变更集有关。如果我将 changelistener 添加到领域而不是结果,它的工作速度非常快。仍然有趣的是,我没有将 changeListener 添加到排序列表,而是添加到未排序列表。排序然后在侦听器内部运行得非常快,但是一旦我在某个地方有一个排序的 RealmResults ,变更集的创建似乎需要一段时间......

这是一个错误还是只是 Realm 的一个弱点?

标签: javakotlinrealmchangelistener

解决方案


问题是领域中两个边缘案例/错误的组合:

  1. RealmResult在创建变更集时会考虑每个人的错误,即使RealmResult它本身没有侦听器(请参阅https://github.com/realm/realm-java/issues/6614)。
  2. Realm 有一个边缘情况,当一个对象具有循环引用 ( ObjectA -> ObjectB -> RealmList<ObjectA>) 被提取到一个列表中并且该列表被排序时,变更集的创建需要很长时间。

我通过删除循环参考来解决这个问题。现在它起作用了。


推荐阅读