我看到一個非常奇怪的問題,從主線程上運行的查詢中獲取計數。我有一個使用適用於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。
感謝您的想法,我使用minSdk 16,所以不能使用資源的想法,但我確實把計數放在一個事務中,現在它正在得到正確的計數。這不應該是必要的,但猜猜這就是生活。 – Kenny
Nah,實際上你可以在Realm.getDefaultInstance()之後用'realm.refresh()'替換它,如果你使用的是Realm 3.2+ – EpicPandaForce