gpt4 book ai didi

android - 如何跨线程传递 RealmResults

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:14 24 4
gpt4 key购买 nike

我在我的应用程序中使用回收器 View ,并想在后台线程上进行一些计算,获取 RealmObjects 列表,并根据它刷新我的适配器。

作为一些背景知识,我有一个重要的排序要求,并且回收器 View 需要显示从不同表上的查询产生的对象(尽管它们仍然产生相同的对象类型)。我不想在主线程上执行这些可能代价高昂的查询。

最好的方法是什么?据我所知,我可以

  1. 从后台线程获取 ids(String) 列表,并在主线程上进行查询。所以我会做类似 realm.where(ObjectA.class).in(listOfIds).findAll() 的事情。但是,我认为我不能保证集合的顺序是我在后台排序的 listOfIds 的顺序。然后我可以手动对 Realm 集合进行排序。

  2. 或者,我可以执行 realm.copyFromRealm(listOfObjectA),假设我已经从我的后台线程中获得了一个对象列表。通过这种方式,我感觉更干净,但我显然失去了自动刷新功能,更不用说它会占用大量内存。似乎昂贵的复制将发生在主线程上,这会破坏我将内容移至后台线程的努力。

我希望有一种方法可以让我将 RealmResults 或 RealmList 从一个线程传输到另一个线程。有人对如何执行此操作有建议吗?

最佳答案

findAllSortedAsync

I have a non trivial sorting requirement

如果此排序纯粹基于您的 RealmObject 字段,您可以使用 RealmQuery.findAllSortedAsync(...) 方法,该方法将为您执行查询排序在一个单独的工作线程上。这是最好的选择。如果可能的话,您还可以分两个阶段进行排序,一个使用 findAllSortedAsync ,第二个在主线程上对已经获得的对象进行排序 - 如果结果是预先排序的,第二阶段可能不会那么昂贵按 Realm 。

and the recycler view needs to display objects that result from queries on different tables

您可以寻找在这些对象之间创建链接的可能性,例如,如果 RealmObject A 有一个字段 b,您可以对 A 通过 b 的字段 - 这可以解决您的问题,并将所有内容保存在一个 Realm 查询中。

使用已排序的 ID 进行查询(否)

Get a list of ids(String) from the background thread, and do a query on the main thread...

你是对的 - 不能保证结果按原始 ID 列表顺序返回,所以这不是一个真正的选择。

copyFromRealm

Or, I can do a realm.copyFromRealm(listOfObjectA)...

这是正确的,但是您必须了解使用此方法的限制和内存开销,即:

  • 您获得了数据的快照,并且必须使用新快照手动更新回收器
  • 对符合原始查询的对象的单一更改将触发更新,并可能重新排序

It seems that the expensive copying would take place on the main thread, which would undermine my efforts to move things into the background thread.

不是真的,如果您在线程 A 上执行 copyFromRealm 并将列表传递给线程 B,则从 realm 硬拷贝值将由线程 A 执行,所以没问题。

关于android - 如何跨线程传递 RealmResults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42657868/

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