Realm Java排序使Changelistener变慢

2019年9月17日 22点热度 0条评论

当我有一个包含大量元素的列表(大约7000个)并且向查询添加排序时,更改侦听器变得非常慢。如果仅给出一个字段,则不是这种情况。从第二个字段开始,它放慢了很多。它似乎还取决于为排序指定哪种字段类型。 bool(boolean) 值似乎非常快。仅使用一个日期时,日期也会变慢。

让我告诉你我做什么:
对具有多个排序元素的所有对象进行非常简单的查询:

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.
}

现在,当更改此结果列表中的某些对象时,更改侦听器需要大量时间来更新数据。同样,同一循环程序上的其他更改侦听器也非常慢。

即使我在添加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)
    )
}

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

这是Bug还是Realm的弱点?

解决方案如下:

问题是两个Edgecases / Bug在 Realm 中的结合:

  • 一个错误,即使创建RealmResult本身没有侦听器,在创建变更集时也会考虑每个 Activity 的RealmResult(请参阅https://github.com/realm/realm-java/issues/6614)。
  • 当在列表中获取具有循环引用(
    ObjectA -> ObjectB -> RealmList<ObjectA>)的对象并且对该列表进行排序时,

  • Realm处于边缘状态,创建变更集需要很长时间。
  • 我通过删除骑行参考来解决此问题。现在可以了。