【问题标题】:Listening to Room database insert with RXJava使用 RXJava 监听 Room 数据库插入
【发布时间】:2019-01-10 21:15:56
【问题描述】:

我有一个带有 Room 数据库的简单 Android 应用程序,我正在尝试使用 RxJava 对 @Insert 查询做出反应,但我无法正确链接调用。

这是我调用插入的视图模型方法:

fun insertTopic(): Single<Long> {
        val topic = Topic(null, topicText.value!!, difficulty.value!!, false)

        return Single.create<Long> { Observable.just(topicDao.insert(topic)) }
    }

这是我的活动中触发保存操作的代码:

disposable.add(RxView.clicks(button_save)
            .flatMapSingle {
                viewModel.insertTopic()
                    .subscribeOn(Schedulers.io())
            }.observeOn(AndroidSchedulers.mainThread())
            .doOnError { Toast.makeText(this, "Error inserting topic", Toast.LENGTH_SHORT).show() }
            .subscribe { id ->
                // NOT INVOKED
                hideKeyboard()
                Toast.makeText(this, "Topic inserted. ID: $id", Toast.LENGTH_SHORT).show()
                this.finish
            })

当我单击按钮时,实体被保存,但没有调用任何订阅代码(没有显示 toast)。有人可以向我指出我做错了什么吗?我对 RX java 还很陌生。

【问题讨论】:

  • 你试过onNext()吗?或许能解决这个问题?

标签: android kotlin rx-java2 android-room


【解决方案1】:

问题在于Single.create 的使用不正确。无需将topicDao.insert(topic) 包装成Observable。此外,您正在手动实现新的 Single,这意味着您必须将结果 id 传递给 @NonNull SingleEmitter&lt;T&gt; emitter 参数。但是这里不需要使用Single.create

Single.fromCallable 正是您所需要的:

fun insertTopic(): Single<Long> = Single.fromCallable {
    val topic = Topic(null, topicText.value!!, difficulty.value!!, false)
    return@fromCallable topicDao.insert(topic)
}

请注意,我在 lambda 中创建了 topic 对象,这样它就不会在闭包中被捕获。还要记住fromCallablemay throwUndeliverableException如果你在lambda代码执行期间取消订阅Single。在您的特定情况下可能永远不会发生,但您应该了解RxJava2 error handling 设计。

【讨论】:

    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2023-03-30
    • 2020-10-29
    • 2023-01-21
    相关资源
    最近更新 更多