Android 领域:已添加记录,无法在其他线程中检索

Android 领域:已添加记录,无法在其他线程中检索,android,multithreading,realm,Android,Multithreading,Realm,我在工作线程(在服务中)中使用Realm.getDefaultInstance()并使用以下内容保存记录: Realm realm = Realm.getDefaultInstance(); realm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { ... realm.co

我在工作线程(在服务中)中使用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(),它将返回这些项目。如果我在第二个工作线程上再次执行该操作,它将什么也找不到。这是某种缓存吗?

问题在于我使用了一个线程池,领域实例没有在该线程池上更新。我的一个解决方案是不使用线程池,因此

observable
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
我现在到处都用这个:

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

它解决了所有领域线程问题。它可能效率稍低,但对我来说还行。

你读过这篇文章吗?你可以用一个侦听器来更新UI:@Tim我读过,它说它应该是无外观的,但它不是:“当你想从不同的线程访问相同的数据时,你可以获得一个新的领域实例(即Realm.getInstance(RealmConfiguration config))UI线程不知道即时更改,因为我们可能需要首先重新运行任何异步查询。使用EventBus发送事件很可能意味着您的事件在我们有机会更新之前到达。您应该使用我们的更改侦听器。它们保证在安全的情况下触发。不是真的。但是我们使用了循环器,因此如果您发布到
runOnUiThread
,runnable应该在我们更新领域后执行。