使用Realm和RxJava 2

时间:2017-06-02 22:25:24

标签: java android realm rx-java rx-java2

我在Android应用程序中使用RxJava 2,并且正在集成Realm。据我所知,Realm默认只支持RxJava 1,并且在查询Observable时允许返回RealmResults<?>,如下所示:

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

返回的Observable来自RxJava 1.我如何一起使用Realm和RxJava 2?我遇到了2个相关问题,找到了herehere,但没有找到简洁的答案。此外,文档(位于此处https://realm.io/docs/java/latest/#rxjava)提及创建自定义RxObservableFactory,但未提供有关如何执行此操作的资源。

Realm如何与已经使用RxJava 2的项目一起使用?

1 个答案:

答案 0 :(得分:3)

解决方案是使用最新的背压策略将RealmResults包装成Flowable。

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());

从Realm 4.0.0-RC1及更高版本开始,我在上面展示的这种行为是使用realmResults.asFlowable()完成的。

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