【发布时间】:2016-06-21 10:00:49
【问题描述】:
我在工作线程(在服务中)中使用 Realm.getDefaultInstance() 并将我的记录保存为:
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
...
realm.copyToRealmOrUpdate(...
完成后(这是同步,因此立即完成),我向 UI 线程提交一条 EventBus 消息,它可以开始下一个任务。
UI 线程再次调用另一个工作线程,该工作线程执行另一个 Realm.getDefaultInstance() 和 findAll() 调用。它什么也没找到。为什么是这样? “一段时间后”它会发现这些项目很好,但不是马上。
这些项目已经在数据库中:如果我在第一个工作线程上保存项目后立即执行 findAll(),它会返回项目。如果我在第二个工作线程上再次这样做,它什么也找不到。这是某种缓存吗?
【问题讨论】:
-
您可以使用监听器来更新 UI:realm.io/docs/java/latest/#realm-threading-example
-
@Tim 我读到了,它说它应该是无缝的,但它不是:“当你想从不同的线程访问相同的数据时,你可以获得一个新的 Realm 实例(即Realm.getInstance(RealmConfiguration config) 或其表兄弟)并通过查询获取您的对象。”
-
UI 线程不知道即时更改,因为我们可能需要先重新运行任何异步查询。使用 EventBus 发送事件很可能意味着您的事件在我们有机会更新之前到达。您应该改用我们的更改侦听器。它们保证在安全的情况下触发。
-
并非如此。但是我们使用 Looper,所以如果您向
runOnUiThread发帖,应该在我们更新 Realm 后执行 runnable。
标签: android multithreading realm