领域结果不一致

时间:2016-10-28 20:20:39

标签: android realm rx-java rx-android

在我的项目中,我使用干净的架构。以下代码位于我的域和数据层中。它是一个通用的实现,所以我不必为每个模型重复它。这段代码工作正常,我已经测试了一百万次。但是在发布我的应用程序后,一些手机(华为p8)正在从数据库中遇到奇怪的行为。一旦我从某个活动调用getList(X),结果就可以了,然后我转到另一个活动进行相同的调用,但响应是空的。有时我会收到一个额外的项目,它只是充满了空值和默认值。我正在使用领域插件1.2。我真的需要修复这个bug。我会很感激任何帮助。

@Override
public Observable getList(@NonNull GetRequest genericUseCaseRequest) {
    return mRepository.getListDynamically(genericUseCaseRequest.getUrl(), genericUseCaseRequest
            .getPresentationClass(), genericUseCaseRequest.getDataClass(), genericUseCaseRequest
            .isPersist(), genericUseCaseRequest.isShouldCache()).compose(applySchedulers());
}
@Override
public Observable<List> getListDynamically(@NonNull String url, Class presentationClass, @NonNull Class dataClass,
                                           boolean persist, boolean shouldCache) {
    try {
        return mDataStoreFactory.dynamically(url, true, mEntityMapperUtil.getDataMapper(dataClass))
                .dynamicGetList(url, presentationClass, dataClass, persist, shouldCache);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
        return Observable.error(e);
    }
}
public DataStore dynamically(@NonNull String url, boolean isGet, EntityMapper entityDataMapper) throws IllegalAccessException {
    if (!url.isEmpty() && (!isGet || Utils.isNetworkAvailable(mContext)))
        return new CloudDataStore(new RestApiImpl(), mDataBaseManager, entityDataMapper);
    else if (mDataBaseManager == null)
        throw new IllegalAccessException(getInstance().getContext().getString(R.string.no_db));
    else
        return new DiskDataStore(mDataBaseManager, entityDataMapper);

}

@Override
public Observable<List> getAll(Class clazz) {
    return Observable.defer(() -> Observable.just(Realm.getDefaultInstance().where(clazz).findAll()));
}

1 个答案:

答案 0 :(得分:1)

如果您使用Schedulers.io()

,则此答案适用

您是否考虑过关闭在线程池中打开的Realm实例?

因为如果你没有关闭Realm(你没有关闭),那么你将体验version retention,你的后台线程中的Realm实例将永远不会再次更新。

在使用this force-refresh workaround打开实例后,还要考虑刷新Realm。

但也要确保关闭实例。实际上,考虑到您尝试使用后台线程进行查询,您应该考虑使用realm.copyFromRealm(realmResults),以便可以自由关闭实例。