领域计数主线程不正确/不一致

时间:2017-06-20 04:37:12

标签: android realm rx-java

我从一个未在主线程上运行的查询中获取计数时遇到了一个非常奇怪的问题。我有一个用于Realm的// ORDER ADD $scope.addQty = function (pid) { //$scope.qty = {}; //$scope.product = $scope.productlist; console.log($scope.qty[pid]); var getlistURL = $scope.baseURL+$scope.uri.uri_1+"/"+$scope.uri.uri_2+"/ng_add_to_cart/"+pid+"/"; $http.post(getlistURL). success(function(data, status) { if(data.length != 0) { $scope.stockmovement = data; $('#showStockMovement').modal('open'); } }); }; 适配器的UI,它只是花花公子。

我有一个方法可以计算查询前的记录数,因此它可以设置一个起始点,由于某种原因,它会返回上一个事务之前的前一个计数。这是一个稍微缩短的版本,带有日志的输出:

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
        });
    }

有人想到吗?我一直试图将这个问题解决几周,认为这是我正在做的事情,但如果我对主线程进行计数并将其传入,它就可以正常工作。

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

1 个答案:

答案 0 :(得分:1)

感觉你在RxThread上有一个Realm实例,之前没有关闭过。由于RxThread没有looper,因此领域实例无法自动更新。因此它在创建时被锁定在版本中。

Realm正在内部使用ref计数器,getDefaultInstance()将返回您之前在RxThread上打开的相同实例。

解决方案: 1.找出在RxThread上检索到哪个Realm实例并正确关闭它。因此,下一次getDefaultInstance()将以最新版本数据返回新的Realm实例。 2.如果要在RxThread上安装Realm实例,可以调用realm.refresh()手动将其移动到最新数据版本。