kotlin协程flow retryWhen当功能函数加载失败后重试(3)
kotlin协程flow retryWhen当功能函数加载失败后重试(3)
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
import java.lang.NullPointerExceptionfun 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() % 2when (p) {0 -> true1 -> falseelse -> false}}var s: String? = nullif (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