- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在我的应用程序中使用回收器 View ,并想在后台线程上进行一些计算,获取 RealmObjects 列表,并根据它刷新我的适配器。
作为一些背景知识,我有一个重要的排序要求,并且回收器 View 需要显示从不同表上的查询产生的对象(尽管它们仍然产生相同的对象类型)。我不想在主线程上执行这些可能代价高昂的查询。
最好的方法是什么?据我所知,我可以
从后台线程获取 ids(String) 列表,并在主线程上进行查询。所以我会做类似 realm.where(ObjectA.class).in(listOfIds).findAll()
的事情。但是,我认为我不能保证集合的顺序是我在后台排序的 listOfIds 的顺序。然后我可以手动对 Realm 集合进行排序。
或者,我可以执行 realm.copyFromRealm(listOfObjectA)
,假设我已经从我的后台线程中获得了一个对象列表。通过这种方式,我感觉更干净,但我显然失去了自动刷新功能,更不用说它会占用大量内存。似乎昂贵的复制将发生在主线程上,这会破坏我将内容移至后台线程的努力。
我希望有一种方法可以让我将 RealmResults 或 RealmList 从一个线程传输到另一个线程。有人对如何执行此操作有建议吗?
最佳答案
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 查询中。
Get a list of ids(String) from the background thread, and do a query on the main thread...
你是对的 - 不能保证结果按原始 ID 列表顺序返回,所以这不是一个真正的选择。
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/
我是一名优秀的程序员,十分优秀!