繁体   English   中英

在RxJava 2中使用Realm

[英]Using Realm with RxJava 2

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

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

返回的Observable来自RxJava1。如何将Realm和RxJava 2一起使用? 我在这里这里遇到了2个相关问题,但是没有找到简洁的答案。 此外,文档(可在此处找到: https : RxObservableFactory )提到创建自定义RxObservableFactory ,但未提供有关如何执行此操作的资源。

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

解决方案是使用最新的反压策略将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(...);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM