【问题标题】:Writing to Realm on main thread.在主线程上写入 Realm。
【发布时间】:2017-06-09 16:33:57
【问题描述】:

在主线程上写Realm可以吗?

基本上我想在开始 ActivityA 之前向 Realm 写一些 ObjectA

一旦ActivityA 启动,它需要立即访问(在onCreateObjectA - 我也可以在主线程上阅读吗?

基本上这个ObjectA 太大而无法通过捆绑包,所以我需要将它存储在缓存中。

我最初考虑将对象存储在内存缓存中,然后在活动开始后将其存储在 Realm 中,但我想知道是否可以跳过编写自己的内存缓存。

【问题讨论】:

  • 如何获得ObjectA?你能通过initialData()把它放到Realm中吗?一般不建议在 UI 线程上使用事务的原因是 1.) 后台线程事务阻塞 beginTransaction() 调用,因此如果您有 bg 线程事务和 2.) 它会强制执行异步查询同步。否则它可以工作,你无论如何都要使用findFirst()
  • initialData() 是什么?是的,我们想在后台线程上运行这些是有道理的。因此,为什么我要考虑先将这些数据存储在内存中,然后再将其懒惰地存储在 Realm 中。只是想知道我是否可以使用 Realm 避免内存缓存,但看起来我不能。
  • 为什么不显示微调器,存储在后台线程中,等待完成,隐藏微调器,启动活动,在活动B中的主线程上读取(如果是单个对象,则读取速度很快),你通过了它是对象的 ID。
  • @clu 嗯?我刚刚说过你可以使用 Realm 避免内存中缓存
  • 真的吗?我想我没看懂你的评论。如果我想避免将对象存储在主线程上,则必须在后台线程中进行。在这种情况下,我还需要从后台线程加载它。这很好,但是当它从 bg 线程加载时,我必须展示一个微调器(正如 Martin 建议的那样)。这是你的意思吗?如果不是,请您详细说明。谢谢!

标签: realm realm-java


【解决方案1】:

在主线程上写Realm可以吗?

在 UI 线程上写入 Realm 有两个含义:

1.) 任何由异步查询 api 创建的 RealmResults 将在事务打开时立即在 UI 线程上同步评估

2.) 如果后台线程已经在事务中写入 Realm,那么它将阻塞 UI 线程,直到该事务被提交。

在您的用例中,您似乎依赖 Realm 在 UI 线程上立即缓存单个对象,因此您可以编写(不会被阻塞),并且您需要立即使用单个对象(所以您需要 @987654322 @ 是同步 API)。

因此,在您的情况下,在 UI 线程上使用 Realm 很可能是安全的。


一般来说,Realm 的最佳实践是在后台线程上写入 Realm,并在 UI 线程上从 Realm 读取(通过保持对 RealmResults 的字段引用,向其中添加 RealmChangeListener,然后在每次更改时接收更新的结果到领域)。

【讨论】:

  • 太棒了!感谢你的回答 :)。您还知道这在 realm.io 上的记录吗?如果您手头没有它,请不要担心。
  • 哇,我从来没有回复过,wtf,反正看到这里medium.com/@Zhuinden/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多