在我的项目中,我使用干净的架构。以下代码位于我的域和数据层中。它是一个通用的实现,所以我不必为每个模型重复它。这段代码工作正常,我已经测试了一百万次。但是在发布我的应用程序后,一些手机(华为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()));
}
答案 0 :(得分:1)
如果您使用Schedulers.io()
:
您是否考虑过关闭在线程池中打开的Realm实例?
因为如果你没有关闭Realm(你没有关闭),那么你将体验version retention,你的后台线程中的Realm实例将永远不会再次更新。
在使用this force-refresh workaround打开实例后,还要考虑刷新Realm。
但也要确保关闭实例。实际上,考虑到您尝试使用后台线程进行查询,您应该考虑使用realm.copyFromRealm(realmResults)
,以便可以自由关闭实例。