Android 当其中一个发生错误时终止可观测链
我想一个接一个地运行一系列Rx Completable。我正在使用Android 当其中一个发生错误时终止可观测链,android,rx-java,reactivex,Android,Rx Java,Reactivex,我想一个接一个地运行一系列Rx Completable。我正在使用concat()来执行此操作,因为我不希望它们同时启动 view.welcome_message_edittext.verifyNotEmpty(getString(R.string.enter_your_email_address)) .concatWith(view.welcome_message_edittext.verifyEmailAddress()) .concatWith(sendMessageToB
concat()
来执行此操作,因为我不希望它们同时启动
view.welcome_message_edittext.verifyNotEmpty(getString(R.string.enter_your_email_address))
.concatWith(view.welcome_message_edittext.verifyEmailAddress())
.concatWith(sendMessageToBot())
.subscribe({
// The user has successfully entered data into the edittext, entered an email into the edittext, and sent message to bot.
}, { error -> })
上面的代码是这样说的,“断言用户已在EditText中输入了文本。如果这是真的,则断言用户已在EditText中输入了电子邮件。如果这两个都是真的,则向bot发送消息。”如果用户在EditText中输入了文本,但它不是电子邮件,则我预计完整表链将断开,并返回onError()有人打电话来
这就是我想发生的事。当任何completable调用onError()
(如verifyNotEmpty()
和verifyEmailAddress()
如果用户将EditText留空或未输入电子邮件地址,则执行该操作),则我希望整个链终止并调用.subscribe()
onError()函数
但是,查看文档中的.concat()
这就是它的实际行为:
调用onError
时,concat()。链条还在继续
所以我的问题是,当任何一个completable调用onError()
时,我需要使用什么来打破这个链条?感谢评论中的@Buckstabue帮助我调试这个问题。他的评论是:
让我猜猜。调用verifyEmailAddress()方法是绝对正常的,我怀疑您正在observable之外执行一些业务逻辑。您可以将该逻辑放入observable中,它将被延迟计算,这类似于observable.just(getMyInteger())和observable.fromCallable(()->getMyInteger())之间的差异。在第二种情况下,将在订阅后延迟调用getMyInteger(),而立即调用第一种
返回我的代码并查看我的verifyEmailAddress()
和sendMessageToBot()
函数:
private fun sendMessageToBot(): Completable {
insertChatMessageIntoConversation(ChatMessage(view!!. welcome_message_edittext.text.toString()))
return Completable.complete()
}
fun EditText.verifyEmailAddress(): Completable {
if (!android.util.Patterns.EMAIL_ADDRESS.matcher(text.trim()).matches()) {
return Completable.error(RuntimeException("Enter a valid email"))
} else {
return Completable.complete()
}
}
函数的逻辑不在可完成块内。当我编写代码时,我认为这并不重要,因为我认为Rx的行为是它执行每个Completable并等待它们完成或完全出错,然后再转到下一个Completable。因此,完全跳过sendMessageToBot()
和verifyEmailAddress()
函数。事实并非如此
这项工作:
fun EditText.verifyEmailAddress(): Completable {
return Completable.fromCallable({
if (!android.util.Patterns.EMAIL_ADDRESS.matcher(text.trim()).matches()) {
val errorMessage = context.getString(R.string.enter_email_address)
error = errorMessage
throw RuntimeException(errorMessage)
}
})
}
private fun sendMessageToBot(): Completable {
return Completable.fromCallable {
insertChatMessageIntoConversation(sage(view!!. welcome_message_edittext.text.toString()))
}
}
我在上一个屏幕截图中没有看到任何错误事件。错误事件在时间线上用十字标记。因此,在这方面使用concat应该是可以的case@Buckstabue我正在使用concat()
。上面的代码片段是我应用程序中的实际代码片段。当我运行代码时,将EditText留空,然后调用verifyEmailAddress()
和sendMessageToBot()
函数。调用了subscribe()
的onError()
,但我希望链会终止,并且verifyEmailAddress()
调用verifyNotEmpty()
后不会调用onError()
。我不知道你的意思。是否要收集所有错误?如果是这样,请查看mergeDelayError( ) operator@Buckstabue从我问题中的代码片段中,我有3个完整的表链接在一起。verifyNotEmpty()
,verifyEmailAddress()
,和sendMessageToBot()
。现在的行为是:如果运行verifyNotEmpty()
的编辑文本为空,则subscribe()
的onError()
被调用,然后Completable链通过调用verifyEmailAddress()
和sendMessageToBot()
继续。我想要:如果运行verifyNotEmpty()
的EditText为空,则subscribe()
的OneError()
被调用,然后Completable链终止,不调用verifyEmailAddress()
和sendMessageToBot()
。让我猜猜。verifyEmailAddress()方法是绝对正常的被调用,我怀疑您正在可观察对象之外执行一些业务逻辑。您可以将该逻辑放在可观察对象内,它将被延迟计算。这类似于可观察对象之间的差异。just(getMyInteger())和observable.fromCallable(()->getMyInteger())。在第二种情况下,getMyInteger()将在订阅后延迟调用,而第一个将立即调用