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

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

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/130092299