Realm Java 排序使 changelistener 变慢
Realm Java sorting makes changelistener slow
当我有一个包含更多元素(大约 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.
}
现在,当此结果列表中的某些对象发生更改时,更改侦听器需要大量时间来更新数据。同一个循环器上的其他更改侦听器也非常慢。
即使我在添加 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 添加到排序列表中,而是添加到未排序列表中。排序然后在侦听器内部工作得非常快,但是一旦我在某个地方有一个排序的 RealmResults,变更集的创建似乎需要一段时间......
这是一个错误还是 Realm 的弱点?
问题是领域中两个 Edgecases/Bugs 的组合:
- 创建变更集时每个活着的
RealmResult
都会被考虑在内的错误,即使 RealmResult
本身没有侦听器(请参阅 https://github.com/realm/realm-java/issues/6614)。
- 当在列表中获取具有循环引用 (
ObjectA -> ObjectB -> RealmList<ObjectA>
) 的对象并对该列表进行排序时,Realm 有一个边界情况,变更集创建需要很长时间。
我通过删除循环引用解决了这个问题。现在可以了。
当我有一个包含更多元素(大约 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.
}
现在,当此结果列表中的某些对象发生更改时,更改侦听器需要大量时间来更新数据。同一个循环器上的其他更改侦听器也非常慢。
即使我在添加 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 添加到排序列表中,而是添加到未排序列表中。排序然后在侦听器内部工作得非常快,但是一旦我在某个地方有一个排序的 RealmResults,变更集的创建似乎需要一段时间......
这是一个错误还是 Realm 的弱点?
问题是领域中两个 Edgecases/Bugs 的组合:
- 创建变更集时每个活着的
RealmResult
都会被考虑在内的错误,即使RealmResult
本身没有侦听器(请参阅 https://github.com/realm/realm-java/issues/6614)。 - 当在列表中获取具有循环引用 (
ObjectA -> ObjectB -> RealmList<ObjectA>
) 的对象并对该列表进行排序时,Realm 有一个边界情况,变更集创建需要很长时间。
我通过删除循环引用解决了这个问题。现在可以了。