首先,我通过Repository类管理realm实例:
public class RealmRepository {
private Lock lock;
protected RealmRepository() {
lock = new ReentrantLock();
}
public <T> T execute(Executor<T> executor) {
Realm realm = null;
try {
lock.lock();
realm = Realm.getDefaultInstance();
return executor.execute(realm);
} finally {
if (realm != null && !realm.isClosed()) {
realm.close();
}
lock.unlock();
}
}
public interface Executor<T> {
T execute(Realm realm);
}
}
而且这个RealmRepository扩展的唯一类就是我的控制器类.
问题是当我第一次执行我的片段中的执行方法时,我得到了:
java.lang.IllegalStateException: This Realm instance has already been closed, making it unusable.
但是在这个错误之后如果重载片段一切正常.在此第一个片段之前,执行方法从Services类调用并且运行良好.
例如:
即使首先执行它,此方法也能完美运行:
public Observable<ModuleRealm> getModule(String moduleTitle) {
return execute(realm -> realm.where(ModuleRealm.class)
.equalTo("code", moduleTitle)
.findAllAsync()
.asObservable()
.first()
.map(RealmResults::first));
}
但是这个抛出异常:
public Observable<List<ProductCategoryRealm>> getProductCategories() {
return execute(realm -> realm.where(ProductCategoryRealm.class)
.findAll()
.asObservable()
.first()
.map(realm::copyFromRealm));
}
解决方法:
在初始初始化调用之后,Realm实例是引用计数.每次调用close()都会减少此引用计数,每次调用getDefaultInstance()都会增加此引用计数.一旦引用计数达到0,就释放了Realm的资源.
考虑到您正在使用Lock来阻止对Realm实例的访问,当您进行close()调用时,导致引用计数达到0,然后在Realm已释放其资源后不重新初始化Realm配置.
为了解决这个问题,您需要在后续调用close()之前调用getDefaultInstance()重叠,以确保您的引用计数保持为>当你仍在积极使用Realm时,你需要重新初始化整个Realm配置,这会对性能产生影响.