gpt4 book ai didi

java - Realm Java 排序使 ChangeListener 变慢

转载 作者:行者123 更新时间:2023-11-30 05:29:29 24 4
gpt4 key购买 nike

当我有一个包含大量元素(大约 7000 个)的列表并且我向查询添加排序时,更改监听器变得非常慢。当仅给出一个字段时,情况并非如此。从第二场开始,速度就慢了很多。它似乎还取决于排序的字段类型。 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(在change 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,变更集的创建似乎需要一段时间...

这是 Realm 的错误还是弱点?

最佳答案

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

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

我通过删除循环引用解决了这个问题。现在可以了。

关于java - Realm Java 排序使 ChangeListener 变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57866533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com