此Realm实例已关闭,使其无法使用+ RxJava

Dra*_*ake 3 android realm

首先,我通过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);
}
}
Run Code Online (Sandbox Code Playgroud)

而且这个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));
}
Run Code Online (Sandbox Code Playgroud)

但是这个抛出异常:

public Observable<List<ProductCategoryRealm>> getProductCategories() {
    return execute(realm -> realm.where(ProductCategoryRealm.class)
            .findAll()
            .asObservable()
            .first()
            .map(realm::copyFromRealm));
}
Run Code Online (Sandbox Code Playgroud)

Sub*_*sed 9

在初始初始化调用之后,Realm实例是引用计数.每次调用close()都会减少此引用计数,每次调用getDefaultInstance()都会增加此引用计数.一旦引用计数达到0,就释放了Realm的资源.

考虑到您正在使用Lock来阻止对Realm实例的访问,当您进行close()调用时,导致引用计数达到0,然后在Realm释放其资源后不重新初始化Realm配置.

为了解决这个问题,你需要调用getDefaultInstance()以便在后续调用close()之前重叠,以确保在你仍然主动使用Realm时你的引用计数保持> 0,否则你需要重新初始化整个Realm每次配置都会对性能产生影响.