android 跨线程,android-如何跨线程传输RealmResults

我在我的应用程序中使用了回收站视图,并希望在后台线程上进行一些计算,获取RealmObjects的列表,然后将其刷新为适配器.

作为背景知识,我对排序有一个微不足道的要求,并且回收者视图需要显示在不同表上查询产生的对象(尽管它们仍然产生相同的对象类型).我不想在主线程上执行这些潜在的昂贵查询.

做这个的最好方式是什么? AFAIK,我可以

>从后台线程获取ids(String)列表,并在主线程上进行查询.所以我会做一些诸如realm.where(ObjectA.class).in(listOfIds).findAll()的操作.但是,我不保证集合的顺序是我在后台排序的listOfIds的顺序.然后,我可以手动对领域集合进行排序.

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

我希望有一种方法可以将RealmResults或RealmList从一个线程转移到另一个线程.有没有人对如何做到这一点有建议?

解决方法:

findAllSortedAsync

I have a non trivial sorting requirement

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

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

您可以寻找在这些对象之间创建链接的可能性,例如,如果RealmObject A具有字段b,则还可以按b的字段对A进行排序-这样可以解决您的问题,并将所有内容保留在一个领域查询中.

用已排序的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,则将由线程A执行从领域的值的硬拷贝,因此很好.

标签:realm,android

来源: https://codeday.me/bug/20191026/1934507.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值