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 被取消。
二,运行结果:
第一个按钮点击后:

第二个按钮点击后,抛出异常时,onCompletion中的代码仍然得到了执行
![]()
第三个按钮点击后,被取消,

浙公网安备 33010602011771号