2016-06-21 36 views
2

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

+1

你读过这个https://realm.io/docs/java/latest/#threading了吗? –

+0

你可以使用一个监听器来更新用户界面:https://realm.io/docs/java/latest/#realm-threading-example – geisshirt

+0

@Tim我读到了,它说它应该是没有用的,但它不是:“当你想从不同的线程访问相同的数据时,你可以获得一个新的Realm实例(即Realm.getInstance(RealmConfiguration config)或它的堂兄弟),并通过查询来获取你的对象。” – Frank

回答

1

该问题是基于我使用线程池,在哪些线程的Realm实例未更新。一种我的解决方法是不使用线程池,所以不是

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

我现在用的这个无处不在:

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

它解决所有领域线程问题。这可能效率稍低,但对我的目的来说很好。