【问题标题】:Realm: records added, not retrievable in other thread领域:已添加记录,无法在其他线程中检索
【发布时间】: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


【解决方案1】:

问题是基于我使用线程池,Realm 实例未在线程池上更新。对我来说一个解决方案是不使用线程池,所以而不是

observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())

我现在到处都用这个:

observable
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())

它解决了所有 Realm 线程问题。它的效率可能有点低,但对我的目的来说很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2016-09-25
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多