gpt4 book ai didi

android - 该 Realm 实例已被关闭,使其无法使用 + RxJava

转载 作者:行者123 更新时间:2023-12-02 10:09:03 24 4
gpt4 key购买 nike

首先,我通过 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 扩展的唯一类,这是我的 Controller 类。问题是当我第一次在我的 fragment 中执行方法时,我得到:

java.lang.IllegalStateException: This Realm instance has already been closed, making it unusable.

但是在此错误之后,如果重新加载 fragment 一切正常。在第一个 fragment 之前,执行从服务类调用的方法并且运行良好。例如:即使首先执行此方法,它也能完美运行:

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 时引用计数保持 > 0,否则您需要重新初始化每次都会更改整个 Realm 配置,这会对性能产生影响。

关于android - 该 Realm 实例已被关闭,使其无法使用 + RxJava,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41447871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com