将 Realm 与 RxJava 2 结合使用

2023-12-26

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

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

返回的 Observable 来自 RxJava 1。如何一起使用 Realm 和 RxJava 2?我遇到了2个相关问题,发现here https://github.com/realm/realm-java/issues/3497 and here https://github.com/realm/realm-java/issues/4135,但没有找到简洁的答案。此外,文档(在这里找到:https://realm.io/docs/java/latest/#rxjava https://realm.io/docs/java/latest/#rxjava)提到创建自定义RxObservableFactory,但没有提供有关如何执行此操作的资源。

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


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

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(...);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Realm 与 RxJava 2 结合使用 的相关文章

随机推荐

  • elasticsearch best_field 和most_field 有什么区别

    这篇文章我已经准备好了https www elastic co guide en elasticsearch reference current query dsl multi match query html https www elas
  • 如何使用 Sidekiq 运行连续后台作业?

    我一直在成功地使用 Sidekiq 来运行由 Rails 3 2 应用程序中的用户操作启动的后台作业 我的特定应用程序涉及通过第三方 API 从外部源发送和接收数据 我需要通过不断检查每个用户是否有数据可供下载来保持数据与此外部源同步 正如
  • 将一些代码从 C++ 转换为 C [重复]

    这个问题在这里已经有答案了 可能的重复 C 代码编译为 C 但不是 C https stackoverflow com questions 3143052 c code compiles as c but not as c Edit 我将库
  • 如何分割字符串同时忽略括号中的部分?

    我有一个字符串 我想使用逗号作为分隔符将其拆分为一个数组 我不希望括号之间的字符串部分被分割 即使它们包含逗号 例如 bibendum morbi non quam nec dui luctus rutrum nulla 应该变成 bibe
  • 使用javascript循环表并读取td内的值

    我有以下内容HTML我试图循环的表td s table thead tr th Product th th class currency Base Value th th class currency Unit Price th th cl
  • 这是 PostgreSQL SQL 引擎的错误吗?如何避免(解决方法)它?

    我正在解析文本文档并将它们插入到 PostgreSQL 数据库中 我的代码是用 Java 编写的 并且使用 JDBC 进行数据库连接 在将数据添加到数据库时 我遇到了非常奇怪的错误 似乎在不可预测的时刻 主循环的迭代次数不同 Postgre
  • Linux shell 脚本向文件名添加前导零

    我有一个包含大约 1 700 个文件的文件夹 他们的名字都像1 txt or 1497 txt等等 我想重命名所有文件 以便所有文件名都是四位数字长 I e 23 txt变成0023 txt 可以执行此操作的 shell 脚本是什么 或相关
  • doGet 方法在 tomcat 7 中运行的 servlet 中被调用两次,并使用 IntelliJ Idea 12 创建

    我创建了一个简单的 servlet 在 doGet 主体中只有一个 System out println 方法 但是当我使用 IntelliJ Idea 12 在 Tomcat 7 中运行它时 我收到一条消息 System out prin
  • 没有重复项或有序集的列表

    是否有一个库提供了一种数据结构 可以保留项目的顺序并且不包含任何重复项 这种数据结构是否存在合适的名称 我希望它的行为就像一个列表nub每次操作后应用 当然 我不希望它实施得那么无效 这是一种解决方案 Use a 手指树 http hack
  • ipywidgets.Textarea 中的等宽字体?

    我怎样才能让我的小部件使用等宽字体 from ipywidgets import Textarea Textarea The world is bigger than you 我想显示一些表格样式的数据 这也有效 from IPython
  • 如何在tkinter中绑定退格键删除多个字符?

    我想要创建绑定 让我可以根据变量按 Tab 键插入预定义数量的空格 然后按 Backspace 删除那么多空格 当用户按下退格键时 如何删除预定数量的空格 我不知道如何删除多个字符 当我尝试解决此问题时 绑定删除了错误数量的字符 这个问题有
  • 如何检测iOS应用程序是否正在UI测试模式下运行

    我希望我的应用程序在 UI 测试模式下运行时运行特殊代码 例如重置其状态 我查看了应用程序从 UI 测试运行时设置的环境变量 并且没有任何明显的参数来区分正常运行的应用程序与 UI 测试中运行的应用程序 有办法找出来吗 我不满意的两个解决方
  • 查找列表中子列表的起始和结束索引

    我有一个清单 greeting hello my name is bob how are you 我想定义一个函数来查找此列表中子列表的第一个和最后一个索引 因此 find sub list my name is greeting 应该返回
  • Primefaces 5:验证码不适用于“javax.servlet.ServletException:表达式不能为空”

    我使用以下代码创建了一个简单的 xhtml 页面 如 Primefaces 展示 div My test div
  • 绑定到 NSDictionary 的“allValues”数组

    我对绑定有什么误解吗 我将 NSArrayController 的内容 绑定到 NSDictionary 的 allValues 数组 它认为它是空的 我绑定到一个随机对象 其属性已设置为同一个 NSDictionary 的 allValu
  • 在 XMPP 中以后台模式工作

    我正在研究 XMPP 我想在后台模式下收到通知 我也实现了这个东西 void xmppStream XMPPStream sender socketWillConnect GCDAsyncSocket socket Tell the soc
  • 使用正确的环境文件将角度应用程序部署到 Heroku

    我正在使用 Angular CLI 开发 Angular4 应用程序 我有环境文件 environments prod ts 和environments dev ts 我想在 Heroku 上创建两个不同的应用程序 每个应用程序使用不同的环
  • 如何查看 WooCommerce 感谢页面

    在 WordPress 中is page 可以通过 ID 名称或 slug 检查页面 但我们如何检查 WooCommerce 感谢页面是否是结帐页面的一部分 我们还有很多 WooCommerce条件标签 https docs woocomm
  • jquery 从索引中选择行

    我希望 给定一个表 id 和一个行索引 从 0 开始 选择该索引处的行 以便我可以将背景颜色应用于其所有 td 我熟悉基本选择 但不确定如何使用索引变量来执行此操作 这应该可以为你解决问题 id tbody gt tr eq rowinde
  • 将 Realm 与 RxJava 2 结合使用

    我在 Android 应用程序中使用 RxJava 2 并集成 Realm 据我所知 Realm 默认只支持 RxJava 1 并且允许Observable查询时返回RealmResults