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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值