【发布时间】:2017-06-20 04:37:11
【问题描述】:
我看到一个非常奇怪的问题,即从不在主线程上运行的查询中获取计数。我有一个使用 Realm 的 RecyclerView 适配器的 UI,而且它的工作原理很花哨。
我有一个方法可以在查询之前计算记录数,因此它可以设置一个起点,由于某种原因,它会返回上次事务之前的上一个计数。这是一个略短的版本,带有日志的输出:
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,因此无法使用资源想法,但我确实将计数放入事务中,现在它得到了正确的计数。这不应该是必要的,但猜猜这就是生活。
-
不,实际上,如果您使用 Realm 3.2+,您可以删除事务并在
Realm.getDefaultInstance()之后将其替换为realm.refresh()