Android 领域实例已经关闭-使用RxJava2
我将Realm与RxJava it结合使用,如下所示:Android 领域实例已经关闭-使用RxJava2,android,realm,rx-java2,Android,Realm,Rx Java2,我将Realm与RxJava it结合使用,如下所示: public Flowable<List<EventEntity>> getAll() { try (final Realm realm = Realm.getInstance(mRealmConfiguration)) { RealmQuery<RealmEvent> query = realm.where(RealmEvent.class); Flowable<RealmRe
public Flowable<List<EventEntity>> getAll() {
try (final Realm realm = Realm.getInstance(mRealmConfiguration)) {
RealmQuery<RealmEvent> query = realm.where(RealmEvent.class);
Flowable<RealmResults<RealmEvent>> result;
if (realm.isAutoRefresh()) {
result = query
.findAllAsync()
.asFlowable()
.filter(RealmResults::isLoaded);
} else {
result = Flowable.just(query.findAll());
}
return result
.unsubscribeOn(AndroidSchedulers.mainThread());
}
}
问题是我获取了异常:java.lang.IllegalStateException:这个领域实例已经被关闭,使其无法使用
我从RealmObservableFactory的角度研究了实现方法,subscribe方法的每次调用都应该创建Realm的新实例。整个情况看起来都是引用计数的问题
您知道问题出在哪里吗?Java的
try with resource
在您离开代码块时关闭资源,但RxJava是懒惰的等等,只有在您实际订阅时才开始工作,这是在您的代码退出getAll()
函数后发生的
编辑:由于您每次构建一个特殊的领域
实例,并将配置传递给它,因此该实例不会共享,因此每次都会最终关闭
相反,在前面使用Realm.setDefaultConfiguration(config)
初始化您的领域。然后,在函数中使用Realm.getDefaultInstance()
,以便访问默认的共享实例,而不是每次创建一个新实例
Edit2:最简单的解决方案是保留对领域
实例的引用:
class MyRepository {
private final Realm realm;
public MyRepository(Realm realm) {
this.realm = realm;
}
public Flowable<List<EventEntity>> getAll() {
RealmQuery<RealmEvent> query = realm.where(RealmEvent.class);
// ...
}
}
Realm realm = Realm.getDefaultInstance();
MyRepository repository = MyRepository(realm);
repository.getAll()
// ...
classmyrepository{
私人最终领域;
公共MyRepository(领域){
this.realm=领域;
}
公共可流getAll(){
RealmQuery=realm.where(RealmEvent.class);
// ...
}
}
Realm Realm=Realm.getDefaultInstance();
MyRepository repository=MyRepository(领域);
repository.getAll()
// ...
我找到了解决办法。这是官方示例中的bug。调用上述链时,必须存在同一线程的其他开放域实例。在其他情况下,RealmResult无效。可用于ESala提到的解决方案。您是否手动调用realm.close()
其他任何地方?否。当我忽略使用资源时,所有功能都正常工作。这对我来说真的很奇怪,因为基于代码,我希望它能工作…:(好的,等等,等等。你确定没有在后台线程上收到该错误吗?因为.just()
如果域关闭时线程没有打开其他实例,则端将不起作用。添加异常堆栈跟踪可能会有所帮助。是的,但subscribe方法的实现再次调用域的getInstance方法。当域实例关闭时,RealmResult将被销毁?@elnino如果我不够清楚,请原谅。您在中请求一个域
站姿,准备一个Flowable
并返回它。问题是,当您返回它时,Realm
实例被try with
关闭。因此,当您稍后订阅时,您已关闭且不再有效的初始Realm
引用。是的,Realm
实例的结果无效当你关闭实例时,我看到了这个解决方案(请使用参考资料进行尝试)在领域的官方页面上。在页面底部。可以解决此问题吗?可以在领域自动关闭之前创建并订阅对象。或者更好的解决方案是在不关闭实例的情况下使用领域?@elnino我想我现在看到了问题:您正在创建一个特殊的领域
实例,将配置传递给它,而不是r等于默认实例。请尝试在前面使用Realm.setDefaultConfiguration(config)
配置Realm
并在代码中使用getDefaultInstance()
。我使用了getDefaultInstance,但结果相同,
class MyRepository {
private final Realm realm;
public MyRepository(Realm realm) {
this.realm = realm;
}
public Flowable<List<EventEntity>> getAll() {
RealmQuery<RealmEvent> query = realm.where(RealmEvent.class);
// ...
}
}
Realm realm = Realm.getDefaultInstance();
MyRepository repository = MyRepository(realm);
repository.getAll()
// ...