Kotlin 系列 之 Flow (一)
Hello I`am Flow , 一看到 Flow 就会很自觉的将它跟 【线程 同步 异步 阻塞】 …巴拉巴拉联系到一起
我想说,这就对了!
所以在介绍Flow 之前,先来参观一下我们之前的撸码场景:
Example 1
一次性返回 所有结果,阻塞线程 ,如果List 中的每个元素都需要很长时间,或者List很长的话。。。 (脑补上厕所pang guang炸裂~)差评!
private fun myMethod() : List<String> = listOf("AA","bb","CC")
fun main() {
myMethod().forEach { println(it) }
}
Example 2
会一个一个的返回结果,但是也会阻塞线程。(虽然不会炸裂,但是我还年轻啊,qian lie xian 没问题啊~)差评!
private fun myMethod():Sequence<String> = sequence{
for (index in 100..105){
Thread.sleep(1000)
yield("$index -> abc")
}
}
fun main() {
myMethod().forEach { println(it) }
}
Example 3
使用协程 ,不阻塞线程,但是一次性返回。(突然泄洪也不是长久之计啊~) 中评!
private suspend fun myMethod():List<String>{
delay(1000)
return listOf("hello","World","hello world")
}
fun main() = runBlocking {
myMethod().forEach { println(it) }
}
那么有没有一种,即不阻塞也能够,一个一个返回的方法呢
天空一声巨响,Flow 闪亮登场!~
一 Flow 的开启
先说结果是 “ 交替打印 ” 的 ,说明 launch{} 与 myMethod() 是并发执行的
flow{} 中的执行结果 ,由 emit() 依次发射返回。
Flow 里面的值是通过 collect 方法收集的,由 collect 开始执行。
flow{} 构建器 中的代码是可以 挂起 的,无需在使用 suspend 标识符
private fun myMethod() = flow{
for (i in 1..4){
delay(100)
emit(i)
}
}
fun main() = runBlocking<Unit> {
launch {
for (i in 1..4){
println("hello $i")
delay(200)
}
}
myMethod().collect{ println("$it")}
}
PS:
1 . 这里注意一下 collect 的导包,使用返回值时Unit的
2 . 直接调用myMethod() 方法是不会执行的,需要调用 Flow 的 ‘终止操作’(如 collect)才会真正执行
二、 Flow 的取消
Flow 自身并没有 额外的取消概念
它的取消是借助于 它所在的协程(如 delay)可以被取消
结果是会打印两次 “Fan:1” “Fan:2”,伴随着 withTimeoutOrNull 协程的取消而取消。
private fun myMethod() = flow{
for (i in 1..4){
delay(100)
println("Fan:$i" )
emit(i)
}
}
fun main() = runBlocking<Unit> {
withTimeoutOrNull(220){
myMethod().collect()
}
}
Flow builder(流构建器)
- flow 是最经常被用到的一种流构建器
- flowOf 构建器 可用于定义能够发射固定数量值的流
- 作为 集合 与 序列 ,它们都提供了 asFlow () 将自身转换为 Flow
fun main() = runBlocking {
// 1 asFlow
(1..10).asFlow().collect{ println(it)}
println("------")
// 2 flowOf
flowOf(10, 20, 30, 40, 50).collect{ println(it)}
}
本小结 介绍了 Flow 的 开启 、 取消 和 构建器 >>>> 下一节 Flow(二)Flow的中间运算符
————————————————
版权声明:本文为CSDN博主「翻滚吧章鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_37558974/article/details/120006221