【发布时间】: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