Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Realm 领域-反应式扩展RxJava2_Realm_Rx Java2 - Fatal编程技术网

Realm 领域-反应式扩展RxJava2

Realm 领域-反应式扩展RxJava2,realm,rx-java2,Realm,Rx Java2,我将Realm与RxJava2结合使用。领域实例必须由程序员关闭还是自动关闭 我对这条链有一个问题: return Observable.merge( getEvents .toObservable() , mChangeEventsNotification .flatMapMaybe(notification -> getEvents .firstElement()

我将Realm与RxJava2结合使用。领域实例必须由程序员关闭还是自动关闭

我对这条链有一个问题:

 return Observable.merge(
      getEvents
        .toObservable()
      ,
      mChangeEventsNotification
        .flatMapMaybe(notification ->
          getEvents
          .firstElement()
        )
    )
Realm抛出java.lang.IllegalStateException:此Realm实例已关闭,无法使用

getEvents的实现与getList()相同

我观看了RealmObservableFactory的实现

运算符firstElement能否关闭合并运算符的第一个可观察对象的域实例

域实例在一个线程内的所有观察者之间共享


它看起来像领域版本4.3.3的bug。当我降级到4.1.0版时,一切都正常。可能是ref count的问题。

为了回答您的问题,我将询问Rx集成的源代码:

public Flowable<RealmResults<E>> asFlowable() {
    if (realm instanceof Realm) {
        return realm.configuration.getRxFactory().from((Realm) realm, this);
在这种情况下,将使用您调用的
asFlowable()
on的RealmResults的Realm实例来获取其RealmConfiguration,并且在创建Flowable的线程(即UI线程或处理程序线程)上增加ref计数

这意味着即使是以下场景也可以工作:

public Flowable<List<MyObject>> getList() {
    try(Realm realm = Realm.getDefaultInstance()) {
        return realm.where(MyObject.class)
                    .findAllAsync()
                    .asFlowable()
                    .filter(RealmResults::isLoaded);
    } // auto-close
}
公共可流动getList(){
try(Realm-Realm=Realm.getDefaultInstance()){
返回realm.where(MyObject.class)
.findAllAsync()
.asFlowable()
.filter(RealmResults::isLoaded);
}//自动关闭
}
只要你不取消订阅,与这个可流动的领域将保持开放


要回答您的问题,是的,您确实需要关闭从某处获得RealmResults的领域实例

public Flowable<List<MyObject>> getList() {
    try(Realm realm = Realm.getDefaultInstance()) {
        return realm.where(MyObject.class)
                    .findAllAsync()
                    .asFlowable()
                    .filter(RealmResults::isLoaded);
    } // auto-close
}