Android 领域实例已经关闭-使用RxJava2

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

我将Realm与RxJava it结合使用,如下所示:

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()
// ...