2017-06-02 81 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,则存在潜在的空指针线程。 –