如何重用相同的 Kotlin Flow 来执行相同的代码
How to reuse the same Kotlin Flow to execute the same code
我在 Android 应用程序中遇到了一个问题,其中 Kotlin 的 flow
将不再能够执行其主体中指定的相同代码,而该代码之前已执行并失败(因此已发出异常)。
由于 Kotlin 的流程像流一样工作,我能否在失败后重用相同的流程来发出新值?
例如:已经执行了一个流程来做一个网络请求,但由于某种原因失败了,如果用户点击“再试一次”,那将是一个很好的用例,这样我就可以使用相同的流程并重试相同的流程执行。
Kotlin flow
的任何“重试”运算符在我的用例中是否有用?
此外,我知道如果我创建一个新的流对象将解决我的问题,但我的问题是,在这种情况下我可以重用 流对象吗?我关于 重用 流程的推理是否有效且有意义?
拜托,谢谢。
一般来说,重复使用同一个流并再次收集它是安全的,即使在失败之后也是如此。它应该只是 re-execute 流的主体。
如果您在某些应用程序中不是这种情况,则可能是该特定流程的主体存在问题。
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
将不再能够执行其主体中指定的相同代码,而该代码之前已执行并失败(因此已发出异常)。
由于 Kotlin 的流程像流一样工作,我能否在失败后重用相同的流程来发出新值?
例如:已经执行了一个流程来做一个网络请求,但由于某种原因失败了,如果用户点击“再试一次”,那将是一个很好的用例,这样我就可以使用相同的流程并重试相同的流程执行。
Kotlin flow
的任何“重试”运算符在我的用例中是否有用?
此外,我知道如果我创建一个新的流对象将解决我的问题,但我的问题是,在这种情况下我可以重用 流对象吗?我关于 重用 流程的推理是否有效且有意义?
拜托,谢谢。
一般来说,重复使用同一个流并再次收集它是安全的,即使在失败之后也是如此。它应该只是 re-execute 流的主体。
如果您在某些应用程序中不是这种情况,则可能是该特定流程的主体存在问题。
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 正是这样做的:如果上游抛出与谓词匹配的异常,它会再次收集。
这并不意味着您应该将此运算符用于您的特定用例,因为我猜想您想要用户确认的事实可能需要更多代码,可能需要手动重新收集。