【问题标题】:Realm save data in one thread acquire in another领域在一个线程中保存数据在另一个线程中获取
【发布时间】:2016-10-06 03:29:23
【问题描述】:

我有两个线程不适用于 UI 线程。在一个线程中,我从服务器接收 JSON 并将其保存到 Realm DB:

Realm realm = Realm.getDefaultInstance();
final RealmResults<MyClass> all = realm.where(MyClass.class).findAll();
realm.executeTransaction(new Realm.Transaction() {
            @Override
           public void execute(Realm realm) {
           all.deleteAllFromRealm();
           realm.createOrUpdateAllFromJson(MyClass.class, recommendations);
      }
 });
 realm.close();

然后,在与用户交互后的另一个线程中,我需要获取此信息,但它不可用:

 Realm realm = Realm.getDefaultInstance();
 RealmResults<MyClass> responseItems = realm.where(MyClass.class).findAll();
 realm.close();

因此,当我在添加它们的线程上获取数据时,我可以看到它们,但在其他线程上它们不可用。如何合并不同线程上的信息或通知实例更新?

使用:io.realm:realm-gradle-plugin:1.0.0

更新: 应用程序重新启动后,来自不同表的信息会合并。

【问题讨论】:

  • 这取决于其他线程是否有弯针。如果是looper线程,则通过handler事件触发更新。您可以使用Realm.addChangeListener() 订阅更改事件。对于没有looper的线程,可以使用Realm.waitForChange()知道数据的变化。请参阅github.com/realm/realm-java/tree/master/examples/threadExample 了解更多信息。
  • 我认为您没有正确理解我的问题。例如,我启动了 AsyncTask - 向 Realm 添加了 5 个元素而不是启动了新的 AsyncTask - 尝试获取它们但表为空。
  • 如果在 ThreadB 中添加元素之前在 ThreadA(数据版本 1)中打开 Realm(添加后的数据版本 2),则 ThreadA 中的 Realm 将停留在数据版本 1,而不会看到版本 2 的变化,直到 Looper 中的下一个 Looper 事件线程或waitForChanges 在非循环线程中返回。但是如果“向Realm添加5个元素然后启动新的AsyncTask”,那就很奇怪了。你能用一些显示两个异步任务启动顺序的代码来修改问题吗?
  • 第二个异步任务的调用要晚得多,所以信息已经在一个表中。
  • 如果您可以向我们发送一个可以重现此问题的示例项目,我们很乐意看看 :) 如果您想私下分享,请发送至 help@realm.io。

标签: java android database multithreading realm


【解决方案1】:

我找到了一种解决方法 - 即使我不需要任何事务,我在调用 where(clazz.class) 之前调用 .beginTransaction() 并且数据是最新的。

【讨论】:

  • 为我工作,我不明白这一点。还要记得查询完后commitTransaction。
  • 来自官方文档:在开始事务之前,Realm 实例会更新到最新版本,以包含来自其他线程的所有更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多