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

How to reuse the same Kotlin Flow to execute the same code

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

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

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

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

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

拜托,谢谢。

一般来说,重复使用同一个流并再次收集它是安全的,即使在失败之后也是如此。它应该只是 re-execute 流的主体。

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

你可以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 正是这样做的:如果上游抛出与谓词匹配的异常,它会再次收集。

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