java - Realm Java 排序使 ChangeListener 变慢

标签 java kotlin realm changelistener

当我有一个包含大量元素(大约 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/

相关文章:

java - Java正则表达式的初学者问题

java - 可以在子类中初始化静态最终字段吗?如果是这样,怎么办?

java - 创建从 Jackson 的 ObjectNode 继承的自定义类

android - 如何使用 Glide 加载数据绑定(bind)图像?

java - 将 Java 和 Kotlin 与 Maven 混合,找不到符号

swift - 使用 Swift ObjectMapper 库访问映射中的 JSONString

android - 如何删除 Realm 数据库中的 Realm 列表

java - 从Java中的数组列表中删除连续的重复项

hibernate - 如何使用 JpaRepository 进行批量(多行)插入?

ios - RLMArray 一对多关系中的重复对象