Kotlin 协程Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )相关的知识,希望对你有一定的参考价值。
文章目录
一、流的构建器函数
1、flow 构建器
在之前的博客
- 【Kotlin 协程】Flow 异步流 ② ( 使用 Flow 异步流持续获取不同返回值 | Flow 异步流获取返回值方式与其它方式对比 | 在 Android 中使用 Flow 异步流下载文件 )
- 【Kotlin 协程】Flow 异步流 ③ ( 冷流 | 流被收集时运行 | 流的连续性 )
中 , 介绍了 flow 流构建器函数 , 其基本用法如下 :
/**
* 使用 flow 构建器 Flow 异步流
* 在该异步流中, 异步地产生 Int 元素
*/
suspend fun flowFunction() = flow<Int>
for (i in 0..2)
// 挂起函数 挂起 500ms
// 在协程中, 该挂起操作不会阻塞调用线程, 会继续执行其它代码指令
// 500ms 恢复执行, 继续执行挂起函数之后的后续代码指令
delay(500)
// 每隔 500ms 产生一个元素
// 通过调用 FlowCollector#emit 生成一个元素
emit(i)
在 flow 流构建器中 , 调用 FlowCollector#emit 函数 发射元素 , 然后在外部 调用 Flow#collect 函数 收集元素 ;
2、flowOf 构建器
使用 flowOf 构建器函数 , 可以创建一个 发射指定元素 的 Flow 异步流 ;
代码示例 :
package kim.hsl.coroutine
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 携程中调用挂起函数返回一个 Flow 异步流
runBlocking
flowOf(0, 1, 2, 3).onEach
// 每次发射元素时调用的代码块
// 这里调用 kotlinx.coroutines.delay 函数挂起 1 秒
delay(1000)
println("发射元素 $it")
.collect
// 每隔 1 秒接收一个元素
println("接收到元素 $it")
执行结果 :
2022-12-23 13:10:55.579 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 0
2022-12-23 13:10:55.580 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 0
2022-12-23 13:10:56.581 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 1
2022-12-23 13:10:56.581 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 1
2022-12-23 13:10:57.619 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 2
2022-12-23 13:10:57.619 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 2
2022-12-23 13:10:58.659 28345-28345/kim.hsl.coroutine I/System.out: 发射元素 3
2022-12-23 13:10:58.659 28345-28345/kim.hsl.coroutine I/System.out: 接收到元素 3
3、asFlow 构建器
使用 数组 , 区间 , 集合 , 序列 的 扩展函数 asFlow 函数 , 可以 将 集合 或 序列 转为 Flow 异步流 ;
代码示例 :
package kim.hsl.coroutine
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 携程中调用挂起函数返回一个 Flow 异步流
runBlocking
(0 ..3).asFlow().onEach
// 每次发射元素时调用的代码块
// 这里调用 kotlinx.coroutines.delay 函数挂起 1 秒
delay(1000)
println("发射元素 $it")
.collect
// 每隔 1 秒接收一个元素
println("接收到元素 $it")
执行结果 :
2022-12-23 13:31:54.862 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 0
2022-12-23 13:31:54.863 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 0
2022-12-23 13:31:55.867 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 1
2022-12-23 13:31:55.868 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 1
2022-12-23 13:31:56.882 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 2
2022-12-23 13:31:56.883 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 2
2022-12-23 13:31:57.922 5313-5313/kim.hsl.coroutine I/System.out: 发射元素 3
2022-12-23 13:31:57.922 5313-5313/kim.hsl.coroutine I/System.out: 接收到元素 3
以上是关于Kotlin 协程Flow 异步流 ④ ( 流的构建器函数 | flow 构建器函数 | flowOf 构建器函数 | asFlow 构建器函数 )的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程Flow 异步流 ③ ( 冷流 | 流被收集时运行 | 流的连续性 )
Kotlin 协程Flow 异步流 ③ ( 冷流 | 流被收集时运行 | 流的连续性 )
Kotlin 协程Flow 异步流 ⑦ ( 调用 FlowCollector#emit 发射元素时自动执行 Flow 流的取消检测 | 启用检测 Flow 流的取消cancellable函数 )
Kotlin 协程Flow 异步流 ⑦ ( 调用 FlowCollector#emit 发射元素时自动执行 Flow 流的取消检测 | 启用检测 Flow 流的取消cancellable函数 )
Kotlin 协程Flow 异步流 ⑤ ( 流的上下文 | 上下文保存 | 查看流发射和收集的协程 | 不能在不同协程中执行流的发射和收集操作 | 修改流发射的协程上下文 | flowOn函数 )
Kotlin 协程Flow 异步流 ⑤ ( 流的上下文 | 上下文保存 | 查看流发射和收集的协程 | 不能在不同协程中执行流的发射和收集操作 | 修改流发射的协程上下文 | flowOn函数 )