Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
领域Java排序使changelistener变慢_Java_Kotlin_Realm_Changelistener - Fatal编程技术网

领域Java排序使changelistener变慢

领域Java排序使changelistener变慢,java,kotlin,realm,changelistener,Java,Kotlin,Realm,Changelistener,当我有一个包含大量元素(大约7000个)的列表,并且我在查询中添加排序时,更改侦听器变得非常慢。当只给出一个字段时,情况并非如此。从第二个场开始,速度减慢了很多。这似乎还取决于为排序指定的字段类型。布尔人似乎很快。当只使用一个日期时,日期也较慢 让我告诉你我做什么: 对具有多个排序元素的所有对象进行非常简单的查询: val theList = realm.where(TheObject::class.java) .sort( arrayOf("fieldBool", "f

当我有一个包含大量元素(大约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.
}
val theList=realm.where(TheObject::class.java)
.分类(
数组(“fieldBool”、“fieldDate”、“fieldString”),
arrayOf(Sort.DESCENDING、Sort.DESCENDING、Sort.DESCENDING)
)
.findAllAsync()
theList.addChangeListener{result:RealmResults->
//将列表设置为视图。
}
现在,当此结果列表中的某个对象发生更改时,更改侦听器需要大量时间来更新数据。同样,同一活套上的其他更改侦听器也非常慢

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

val theList=realm.where(TheObject::class.java)
.findAllAsync()
theList.addChangeListener{result:RealmResults->
viewToSet.list=result.sort(
数组(“fieldBool”、“fieldDate”、“fieldString”),
arrayOf(Sort.DESCENDING、Sort.DESCENDING、Sort.DESCENDING)
)
}
更新速度非常慢。我发现这可能与监听和计算变更集有关。如果我将changelistener添加到域中而不是结果中,那么它的运行速度相当快。有趣的是,我并没有将changeListener添加到排序列表中,而是添加到未排序列表中。排序然后在侦听器内部运行得相当快,但是一旦我有了一个排序的RealmResults,创建变更集似乎需要一段时间


这是一个bug还是仅仅是Realm的一个弱点?

问题是Realm中有两个edgecase/bug:

  • 在创建变更集时,即使
    RealmResult
    本身没有侦听器,也会考虑到每个活着的
    RealmResult
    的bug(请参阅)
  • 领域有一个edgecase当一个对象有循环引用(
    ObjectA->ObjectB->RealmList
    )被提取到一个列表中并且该列表被排序时,变更集的创建需要很长时间
  • 我通过删除循环引用修复了这个问题。现在它起作用了

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