android - 如何重用相同的 Kotlin Flow 来执行相同的代码

标签 android kotlin exception kotlin-flow

我在 Android 应用程序中遇到了一个问题,其中 Kotlin 的 flow 将不再能够执行其主体中指定的相同代码,而该代码之前已执行且失败(因此出现了异常)发射)。

由于 Kotlin 的流程像流一样工作,我可以在失败后重用相同的流程来发出新值吗?

例如:已执行一个流程来执行网络请求,但由于某种原因失败,如果用户单击“重试”,这将是一个很好的用例,这样我就可以使用相同的流程并重试相同的执行。

Kotlin flow 的任何“重试”运算符在我的用例中都有用吗?

此外,我知道如果我创建一个新的流对象将解决我的问题,但我的问题是,在这种情况下我可以重用流对象吗?我重用流程的理由是否有效且有意义?

请并谢谢您。

最佳答案

一般来说,即使在失败之后,重用相同的流并再次收集它也是安全的。它应该简单地重新执行流程的主体。

如果您在某些应用程序中不是这种情况,则可能是该特定流程的主体存在问题。

您可以try this yourself :

val flow = flow {
    emit(1)
    emit(2)
    error("BOOM")
}

println(flow.first())
println(runCatching { flow.toList() })
println(flow.take(2).toList())

打印:

1
Failure(java.lang.IllegalStateException: BOOM)
[1, 2]

Can any of the "retry" operators of Kotlin's flow be useful in my use case?

retry正是这样做的:如果上游抛出与谓词匹配的异常,它会再次收集。

这并不意味着您应该针对您的特定用例使用此运算符,因为我猜想您希望用户确认的事实可能需要更多代码,可能需要手动重新收集。

关于android - 如何重用相同的 Kotlin Flow 来执行相同的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70868082/

相关文章:

kotlin - 什么是 Kotlin 相当于 Class<?>

c++ - 异常:STATUS_ACCESS_VIOLATION - 指针引用

android - 如何用图像更改 Slider 的拇指 Material Component Android?

android - 动态更改 ActionBar 中的图标

java - 如何通过上下文菜单从 SQLite 数据库中删除项目?

java - ArrayList、IntArray 和 Array<Int> 之间的区别

java - 如何在Android上为JWE从字符串生成公钥?

java - Android - Java - 找不到处理 Intent 的 Activity

PostgreSQL:如果下一条语句是 RAISE EXCEPTION,则在函数中删除外部服务器将不起作用

c# - Exception 的 .ToString() 和 .Message 有什么区别?