kotlin: flow: onStart和onCompletion

一,代码:

        //处理按钮点击事件
        binding.button2.setOnClickListener {
            runBlocking {
                flowOf(1, 2, 3, 4, 5)
                    .take(2) // 注意这里
                    .filter {
                        println("filter: $it")
                        it > 2
                    }
                    .map {
                        println("map: $it")
                        it * 2
                    }
                    .onStart { println("onStart") }
                    .onCompletion { println("onCompletion") } // 注意这里
                    .collect {
                        println("collect: $it")
                    }
            }
        }

        //处理按钮点击事件
        binding.button3.setOnClickListener {
            runBlocking {
                flowOf(4, 5, 6)
                    .onCompletion { println("onCompletion : $it") }
                    .collect {
                        println("collect: $it")
                        // 仅用于测试,生产环境不应该这么创建异常
                        throw IllegalStateException() // 2
                    }
            }
        }

        //处理按钮点击事件
        binding.button4.setOnClickListener {
            runBlocking {
                flow {
                    emit(1)
                    emit(2)
                    emit(3)
                }.onCompletion { println("onCompletion first: $it") }
                 .collect {
                        println("collect: $it")
                        if (it == 2) {
                            cancel()            // 1
                            println("cancel")
                        }
                 }
            }
        }

说明:

onStart,它的作用是注册一个监听事件:当 flow 启动以后,它就会被回调
onStart 的执行顺序,并不是严格按照上下游来执行的。
虽然 onStart 的位置是处于下游,而 filter、map、take 是上游,但 onStart 是最先执行的。
因为它本质上是一个回调,不是一个数据处理的中间站。

onCompletion 的执行顺序,跟它在 Flow 当中的位置无关。
onCompletion 只会在 Flow 数据流执行完毕以后,才会回调

onCompletion{} 在面对以下三种情况时都会进行回调:
情况 1,Flow 正常执行完毕;
情况 2,Flow 当中出现异常;
情况 3,Flow 被取消。

二,运行结果:

第一个按钮点击后:

image

第二个按钮点击后,抛出异常时,onCompletion中的代码仍然得到了执行

image

第三个按钮点击后,被取消,

image

 

posted @ 2025-08-02 15:00  刘宏缔的架构森林  阅读(32)  评论(0)    收藏  举报