繁体   English   中英

使用RXJava监听Room数据库插入

[英]Listening to Room database insert with RXJava

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

这是我的视图模型方法,调用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
            })

当我单击按钮时,将保存该实体,但不会调用任何订阅代码(不显示吐司)。 有人可以向我指出我在做什么错吗? 我是RX Java的新手。

问题在于Single.create使用不正确。 无需将topicDao.insert(topic)包装到Observable 此外,您正在手动实现新的Single,这意味着您必须将结果ID传递给@NonNull SingleEmitter<T> 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对象,以便不会在闭包中捕获它。 还请记住,如果您在执行lambda代码期间取消订阅Single ,则fromCallable 可能会引发 UndeliverableException 在您的特定情况下,它可能永远不会发生,但是您应该了解RxJava2错误处理设计。

暂无
暂无

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

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