2017-06-20 38 views
0

我看到一個非常奇怪的問題,從主線程上運行的查詢中獲取計數。我有一個使用適用於Realm的RecyclerView適配器的用戶界面,它的工作原理很簡單。領域計數不正確/不一致主線程

我有一個方法可以計算查詢前的記錄數,因此它可以設置一個起點,出於某種原因,它將返回前一個計數在最後一個事務之前。這裏是一個略微縮短的版本與日誌的輸出:

D/SearchController: Query Count (Main Thread): 50 
D/SearchController: Query Count (Rx Thread): 50 
D/SearchController: Query Count (Main Thread): 100 
D/SearchController: Query Count (Rx Thread): 50 

public Single<Update> searchWithCriteriaForMore(SearchCriteria searchCriteria) { 
     Realm realmI = Realm.getDefaultInstance(); 
     Timber.d("Query Count (Main Thread): %d", realmI.where(Ad.class).equalTo("searchId", searchCriteria.id()).count()); 
     realmI.close(); 
     return Single.defer(() -> { 
      Realm realm = Realm.getDefaultInstance(); 
      Timber.d("Query Count (Rx Thread): %d", realm.where(Ad.class).equalTo("searchId", searchCriteria.id()).count()); 
      realm.close(); 
// Stuff to add records on Rx Thread 
     }); 
    } 

調用看起來是這樣的:

SearchController.instance().searchWithCriteriaForMore(searchCriteria) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new SingleSubscriber<SearchController.Update>() { 
     ... 
    } 

思考的人?我一直在試圖將這個問題討論幾個星期,認爲這是我正在做的事情,但是如果我在主線程中進行計數並將其傳入,它就可以正常工作。

我正在運行RxJava 1.2.7,RxAndroid 1.2.1和Realm 3.3.1。

+0

感謝您的想法,我使用minSdk 16,所以不能使用資源的想法,但我確實把計數放在一個事務中,現在它正在得到正確的計數。這不應該是必要的,但猜猜這就是生活。 – Kenny

+0

Nah,實際上你可以在Realm.getDefaultInstance()之後用'realm.refresh()'替換它,如果你使用的是Realm 3.2+ – EpicPandaForce

回答

1

感覺你在RxThread之前沒有關閉過的Realm實例。由於RxThread沒有活套,領域實例不能自動更新。所以它在創建時被鎖定在版本中。

領域內部使用ref計數器,getDefaultInstance()只會返回您之前在RxThread上打開的同一個實例。

解決方案: 1.找出在RxThread上檢索哪個Realm實例並正確關閉它。所以下一次getDefaultInstance()會以最新的版本數據返回一個新的Realm實例。 2.如果要在RxThread上創建Realm實例,可以撥打realm.refresh()手動將其移動到最新的數據版本。

相關問題