首先,我通过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:此Realm实例已被关闭,使其无法使用。
但是在这个错误之后如果重载片段一切正常。在此第一个片段之前,执行方法从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));
}
答案 0 :(得分:7)
Realm实例在初始初始化调用后被引用计数。每次调用close()都会减少此引用计数,每次调用getDefaultInstance()都会增加此引用计数。一旦引用计数达到0,就释放了Realm的资源。
考虑到您正在使用Lock来阻止对Realm实例的访问,当您进行close()调用时,导致引用计数达到0,然后在Realm已释放后不重新初始化Realm配置它的资源。
为了解决此问题,您需要在后续调用close()之前调用getDefaultInstance()重叠,以确保您的引用计数保持&gt;当你还在积极使用Realm时,你需要重新初始化整个Realm配置,这会对性能产生影响。
答案 1 :(得分:1)
在调用方法获得结果之前,将执行finally
方法。在这种情况下。
答案 2 :(得分:0)
Realm 实例可以通过try with resource 进行初始化。你可以使用
try (Realm realm = Realm.getDefaultInstance()){
realm.beginTransaction();
// your queries
realm.commitTransaction();
}
Realm 实例实现了 Closable 接口,允许您忽略正在运行的实例数量。