> 文章列表 > kotlin协程flow retryWhen当功能函数加载失败后重试(3)

kotlin协程flow retryWhen当功能函数加载失败后重试(3)

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

在线动漫