2017-11-15 5 views
0

私はRxJava2と一緒にレルムを使用しています。 Realmのインスタンスはプログラマによって閉じられるか、自動的に閉じられる必要がありますか?レルム - 反応拡張RxJava2

私はこのチェーンに問題があります。

return Observable.merge(
     getEvents 
     .toObservable() 
     , 
     mChangeEventsNotification 
     .flatMapMaybe(notification -> 
      getEvents 
      .firstElement() 
     ) 
    ) 

レルムはjava.lang.IllegalStateExceptionをスロー:このレルムインスタンスはすでにそれが使用できなくなり、閉じられています。

getEventsの実装はgetList()と同じです。

実装RealmObservableFactoryを見ました。

Can演算子firstElement close Realmマージ演算子のオブザーバブルを最初に表示しますか?

レルムインスタンスは、1つのスレッド内のすべてのオブザーバ間で共有されますか?

Realmバージョン4.3.3の不具合に見えます。バージョン4.1.0にダウングレードすると、everythinkは問題ありません。 refカウントの問題かもしれません。

答えて

0

あなたの質問に答えるために、私は、Rxの統合のためのソースコードを頼むよ:

public Flowable<RealmResults<E>> asFlowable() { 
    if (realm instanceof Realm) { 
     return realm.configuration.getRxFactory().from((Realm) realm, this); 

RxObservableFactoryが行うデフォルトRealmObservableFactory、による場合:何が起こる

@Override 
public <E> Flowable<RealmResults<E>> from(final Realm realm, final RealmResults<E> results) { 
    final RealmConfiguration realmConfig = realm.getConfiguration(); 
    return Flowable.create(new FlowableOnSubscribe<RealmResults<E>>() { 
     @Override 
     public void subscribe(final FlowableEmitter<RealmResults<E>> emitter) throws Exception { 
      // Gets instance to make sure that the Realm is open for as long as the 
      // Observable is subscribed to it. 
      final Realm observableRealm = Realm.getInstance(realmConfig); 
      resultsRefs.get().acquireReference(results); 
      final RealmChangeListener<RealmResults<E>> listener = new RealmChangeListener<RealmResults<E>>() { 
       @Override 
       public void onChange(RealmResults<E> results) { 
        if (!emitter.isCancelled()) { 
         emitter.onNext(results); 
        } 
       } 
      }; 
      results.addChangeListener(listener); 

      // Cleanup when stream is disposed 
      emitter.setDisposable(Disposables.fromRunnable(new Runnable() { 
       @Override 
       public void run() { 
        results.removeChangeListener(listener); 
        observableRealm.close(); 
        resultsRefs.get().releaseReference(results); 
       } 
      })); 

      // Emit current value immediately 
      emitter.onNext(results); 

     } 
    }, BACK_PRESSURE_STRATEGY); 
} 

た場合asFlowable()を呼び出したRealmResultsのRealmインスタンスがRealmConfigurationを取得するために使用され、RefableカウントがFlowableが作成されたスレッド(UIスレッドまたは手lerスレッド)。

これも、次のシナリオがうまくいくことを意味します

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

そして、この流動性に関連したレルムは限り、あなたは同様フロアブルから退会していないようするために開いたままになります。


質問に答えるには、はい、RealmResultsを取得したRealmインスタンスをどこかから閉じる必要があります。

関連する問題