2016-06-21 20 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()) 

它解決所有領域線程問題。這可能效率稍低,但對我的目的來說很好。