2017-06-02 84 views
2

我在我的Android應用程序中使用RxJava 2,並且正在集成Realm。據我所知,境界只支持RxJava默認值爲1,並允許查詢RealmResults<?>的時候,像這樣將返回一個Observable使用Realm和RxJava 2

Realm.getDefaultInstance() 
    .where(VideoBundle.class) 
    .findAll() 
    .asObservable() 
    .first() 

可觀測的返回是從RxJava 1.我如何使用領域和RxJava 2在一起?我遇到了2個相關問題,發現herehere,但沒有找到簡潔的答案。此外,文檔(在這裏找到:https://realm.io/docs/java/latest/#rxjava)提到了創建自定義RxObservableFactory,但沒有提供如何這樣做的資源。

Realm如何與已經使用RxJava 2的項目一起使用?

+0

'Realm.getDefaultInstance()。where(VideoBundle.class)'希望不是因爲你永遠不會關閉*那個Realm實例。 – EpicPandaForce

+0

順便說一句,解決方案是用Rx2的東西包裝Realm的東西,https://github.com/realm/realm-java/issues/3497#issuecomment-275375789 – EpicPandaForce

回答

3

解決方案是將RealmResults封裝到Flowable中,並使用最新的backpressure策略。

private io.reactivex.Flowable<RealmResults<_>> getSomeItems() { 
    return io.reactivex.Flowable.create(new FlowableOnSubscribe<RealmResults<__>>() { 
     @Override 
     public void subscribe(FlowableEmitter<RealmResults<__>> emitter) 
       throws Exception { 
      Realm realm = Realm.getDefaultInstance(); 
      RealmResults<__> results = realm.where(__.class).findAllSortedAsync("__"); 

      final RealmChangeListener<RealmResults<__>> listener = _realm -> { 
       if(!emitter.isUnsubscribed() && results.isLoaded()) { 
        emitter.onNext(results); 
       } 
      }; 
      emitter.setDisposable(Disposables.fromRunnable(() -> { 
       results.removeChangeListener(listener); 
       realm.close(); 
      })); 
      results.addChangeListener(listener); 
     } 
    }, BackpressureStrategy.LATEST) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .unsubscribeOn(AndroidSchedulers.mainThread()); 

從境界4.0.0-RC1及以上,這種行爲我上面顯示,使用realmResults.asFlowable()進行烘烤。

Disposable subscription = realm.where(__.class) 
           .findAllSortedAsync("__") 
           .asFlowable() 
           .filter(RealmResults::isLoaded) 
           .subscribe(...); 
+0

我採取了4.0.0-rc1版本,它似乎它有在RealmObject類中放入流。所以他們可能會改變它。我仍在調查。 –

+0

沒有改變,只是爲同樣的事情提供第一方支持。不要忘記取消訂閱。 – EpicPandaForce

+0

如果您使用findFirst而不是findAllSorted,則存在潛在的空指針線程。 –