0
点赞
收藏
分享

微信扫一扫

Kotlin 系列 之 Flow (一)

洛茄 2022-03-12 阅读 75
android

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 的取消

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的中间运算符
————————————————

举报

相关推荐

0 条评论