kotlin协程flow retryWhen当功能函数加载失败后重试(3)
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
import java.lang.NullPointerException
fun main(args: Array<String>) {
runBlocking {
load().onEach {
if (it == null) {
throw NullPointerException()
}
}.retryWhen { cause, attempt ->
if (cause is NullPointerException) {
println("重试 $attempt")
delay(1000) //延时重新尝试
}
attempt < 3
}
.onCompletion { println("onCompletion") }
.collect { println("collect $it") }
}
}
fun load() = flow {
//生成一个概率布尔,模拟加载概率性成功与失败
var b = Boolean.let {
var p: Int = (Math.random() * 10).toInt() % 2
when (p) {
0 -> true
1 -> false
else -> false
}
}
var s: String? = null
if (b) {
println("加载成功")
s = "fly"
} else {
println("加载失败")
}
emit(s)
}
一次性加载成功:
加载成功
collect fly
onCompletion
加载一次失败,重试1次成功
加载失败
重试 0
加载成功
collect fly
onCompletion
再跑,加载一次失败,重试三次失败:
加载失败
重试 0
加载失败
重试 1
加载失败
重试 2
加载失败
重试 3
onCompletion
Exception in thread "main" java.lang.NullPointerException
at MainKt$main$1$1.invokeSuspend(Main.kt:10)
at MainKt$main$1$1.invoke(Main.kt)
at MainKt$main$1$1.invoke(Main.kt)
at kotlinx.coroutines.flow.FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1$2.emit(Emitters.kt:223)
at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.invoke(SafeCollector.kt:15)
at kotlinx.coroutines.flow.internal.SafeCollectorKt$emitFun$1.invoke(SafeCollector.kt:15)
at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:87)
at kotlinx.coroutines.flow.internal.SafeCollector.emit(SafeCollector.kt:66)
at MainKt$load$1.invokeSuspend(Main.kt:45)
at MainKt$load$1.invoke(Main.kt)
at MainKt$load$1.invoke(Main.kt)
at kotlinx.coroutines.flow.SafeFlow.collectSafely(Builders.kt:61)
at kotlinx.coroutines.flow.AbstractFlow.collect(Flow.kt:230)
at kotlinx.coroutines.flow.FlowKt__TransformKt$onEach$$inlined$unsafeTransform$1.collect(SafeCollector.common.kt:113)
at kotlinx.coroutines.flow.FlowKt__ErrorsKt.catchImpl(Errors.kt:156)
at kotlinx.coroutines.flow.FlowKt.catchImpl(Unknown Source)
at kotlinx.coroutines.flow.FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1.collect(SafeCollector.common.kt:117)
at kotlinx.coroutines.flow.FlowKt__ErrorsKt$retryWhen$$inlined$unsafeFlow$1$1.invokeSuspend(SafeCollector.common.kt)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:234)
at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166)
at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:397)
at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:431)
at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:420)
at kotlinx.coroutines.CancellableContinuationImpl.resumeUndispatched(CancellableContinuationImpl.kt:518)
at kotlinx.coroutines.EventLoopImplBase$DelayedResumeTask.run(EventLoop.common.kt:500)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:284)
at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)
at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)
at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
at MainKt.main(Main.kt:7)
https://zhangphil.blog.csdn.net/article/details/130086523https://zhangphil.blog.csdn.net/article/details/130086523