【Kotlin 协程】Flow 异步流 ⑥ ( 调用 Flow#launchIn 函数指定流收集协程 | 通过取消流收集所在的协程取消流 )

news/2024/5/2 11:32:23/文章来源:https://blog.csdn.net/han1202012/article/details/128419725

文章目录

  • 一、调用 Flow#launchIn 函数指定流收集协程
    • 1、指定流收集协程
    • 2、Flow#launchIn 函数原型
    • 3、代码示例
  • 二、通过取消流收集所在的协程取消流





一、调用 Flow#launchIn 函数指定流收集协程



1、指定流收集协程


响应式编程 , 是 基于事件驱动 的 , 在 Flow 流中会产生源源不断的事件 , 就是 发射元素操作 ;

拿到 Flow 流后 , 开始 收集元素 , 按照顺序逐个处理产生的事件 ( 元素 ) ;


调用 Flow#launchIn 函数 , 传入 协程作用域 作为参数 , 可以 指定 收集 Flow 流元素 的 协程 ;

在上一篇博客 【Kotlin 协程】Flow 异步流 ⑤ 中 , 调用 Flow#flowOn 函数 , 可以 指定 Flow 流发射元素 的 协程 ;


Flow#launchIn 函数返回值是 Job 对象 , 是 协程任务对象 , 可调用 Job#cancel 函数取消该协程任务 ;


2、Flow#launchIn 函数原型


Flow#launchIn 函数原型 :

/*** 终端流操作符,在[作用域]中[启动][启动]给定流的[收集][收集]。* 它是“范围”(scope)的简称。启动{flow.collect()} '。** 此操作符通常与[onEach], [onCompletion]和[catch]操作符一起使用,以处理所有发出的值* 处理上游流或处理过程中可能发生的异常,例如:** ```* flow*     .onEach { value -> updateUi(value) }*     .onCompletion { cause -> updateUi(if (cause == null) "Done" else "Failed") }*     .catch { cause -> LOG.error("Exception: $cause") }*     .launchIn(uiScope)* ```** 注意,[launchIn]的结果值没有被使用,提供的作用域负责取消。*/
public fun <T> Flow<T>.launchIn(scope: CoroutineScope): Job = scope.launch {collect() // tail-call
}

3、代码示例


代码示例 :

package kim.hsl.coroutineimport android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 携程中调用挂起函数返回一个 Flow 异步流runBlocking {println("流收集时的协程上下文 : ${Thread.currentThread().name}")flowEvent().onEach {// 逐个处理产生的事件println("接收到事件 : $it, 当前线程 : ${Thread.currentThread().name}")}.launchIn(CoroutineScope(Dispatchers.IO)) // 在指定的协程作用域中处理收集元素操作,// 该 launchIn 函数返回一个 Job 对象.join()     // 该协程不是 runBlocking 主协程 的子协程, 需要调用 join 等待协程执行完毕}}/*** 使用 flow 构建器 Flow 异步流* 产生事件的 事件源*/suspend fun flowEvent() = (0..3).asFlow()                               // 将区间转为 Flow 流.onEach {delay(500)println("发射事件 : $it, 当前线程 : ${Thread.currentThread().name}")}      // 发射元素 ( 产生事件 ) 时挂起 500ms.flowOn(Dispatchers.Default)           // 设置发射元素的协程
}

执行结果 :

2022-12-23 16:06:58.720 2950-2950/kim.hsl.coroutine I/System.out: 流收集时的协程上下文 : main
2022-12-23 16:06:59.345 2950-3080/kim.hsl.coroutine I/System.out: 发射事件 : 0, 当前线程 : DefaultDispatcher-worker-3
2022-12-23 16:06:59.347 2950-3078/kim.hsl.coroutine I/System.out: 接收到事件 : 0, 当前线程 : DefaultDispatcher-worker-1
2022-12-23 16:06:59.885 2950-3078/kim.hsl.coroutine I/System.out: 发射事件 : 1, 当前线程 : DefaultDispatcher-worker-1
2022-12-23 16:06:59.887 2950-3079/kim.hsl.coroutine I/System.out: 接收到事件 : 1, 当前线程 : DefaultDispatcher-worker-2
2022-12-23 16:07:00.394 2950-3080/kim.hsl.coroutine I/System.out: 发射事件 : 2, 当前线程 : DefaultDispatcher-worker-3
2022-12-23 16:07:00.396 2950-3080/kim.hsl.coroutine I/System.out: 接收到事件 : 2, 当前线程 : DefaultDispatcher-worker-3
2022-12-23 16:07:00.938 2950-3078/kim.hsl.coroutine I/System.out: 发射事件 : 3, 当前线程 : DefaultDispatcher-worker-1
2022-12-23 16:07:00.940 2950-3079/kim.hsl.coroutine I/System.out: 接收到事件 : 3, 当前线程 : DefaultDispatcher-worker-2

在这里插入图片描述





二、通过取消流收集所在的协程取消流



Flow 流的 收集元素 操作 , 是在协程中执行 , 将 协程 取消 , 即可将 Flow 流收集操作 取消 , 也就是 将 Flow 流取消 ;


代码示例 : 使用 withTimeoutOrNull(2000) 创建一个协程 , 该协程在 2000ms 后自动超时取消 , 同时在其中进行 流收集 的操作也一并取消 ;

package kim.hsl.coroutineimport android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 携程中调用挂起函数返回一个 Flow 异步流runBlocking {// 该协程作用域 2 秒后超时取消withTimeoutOrNull(2000){flowEvent().collect {println("收集到元素 : $it")}}println("协程作用域取消")}}/*** 使用 flow 构建器 Flow 异步流* 产生事件的 事件源*/suspend fun flowEvent() = (0..10).asFlow()                               // 将区间转为 Flow 流.onEach {delay(500)println("发射事件 : $it, 当前线程 : ${Thread.currentThread().name}")}      // 发射元素 ( 产生事件 ) 时挂起 500ms.flowOn(Dispatchers.Default)           // 设置发射元素的协程
}

执行结果 :

2022-12-23 16:37:02.915 9585-9647/kim.hsl.coroutine I/System.out: 发射事件 : 0, 当前线程 : DefaultDispatcher-worker-1
2022-12-23 16:37:02.917 9585-9585/kim.hsl.coroutine I/System.out: 收集到元素 : 0
2022-12-23 16:37:03.429 9585-9647/kim.hsl.coroutine I/System.out: 发射事件 : 1, 当前线程 : DefaultDispatcher-worker-1
2022-12-23 16:37:03.431 9585-9585/kim.hsl.coroutine I/System.out: 收集到元素 : 1
2022-12-23 16:37:03.932 9585-9647/kim.hsl.coroutine I/System.out: 发射事件 : 2, 当前线程 : DefaultDispatcher-worker-1
2022-12-23 16:37:03.933 9585-9585/kim.hsl.coroutine I/System.out: 收集到元素 : 2
2022-12-23 16:37:04.327 9585-9585/kim.hsl.coroutine I/System.out: 协程作用域取消

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_239427.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据改版 | CnOpenData中国工业企业基本信息扩展数据

CnOpenData中国工业企业基本信息扩展数据 一、数据简介 拉动中国经济的三个产业中&#xff0c;工业企业占有特殊的地位&#xff0c;是推动国内经济发展的重要产业。工业是最主要的物质生产部门&#xff0c;为居民生活、各行业的经济活动提供物质产品&#xff0c;这一重要作用是…

垃圾回收机制之v8引擎

v8的内存分配 &#xff08;栈&#xff08;执行环境&#xff09;跟堆&#xff09; 堆内存负责垃圾回收机制&#xff0c;只有新生代和老生代两部分 新生代&#xff1a;对等分的&#xff08;严格&#xff09; 老生代&#xff1a; 都是由新生代转变的&#xff08;连续的空间&…

截至2022年12月共计451个信息安全国家标准 汇总

写在前面 早年刚参加信息安全工作更多的学点皮毛技术&#xff0c;到处找安全工具&#xff0c;跟踪poc&#xff0c;拿到一个就全网扫一遍&#xff0c;从来没有想过&#xff0c;系统化的安全工作应该怎样搞?我做的工作在安全体系中处于哪个阶段? 后来有机会做企业安全建设&…

五、Kubernetes命令行工具 (kubectl)

1、概述 kubectl 是 Kubernetes 集群的命令行工具&#xff0c;通过 kubectl 能够对集群本身进行管理&#xff0c;并能 够在集群上进行容器化应用的安装部署。 2、语法 使用以下语法从终端窗口运行 kubectl 命令&#xff1a; kubectl [command] [TYPE] [NAME] [flags] 其中 …

数据仓库基础与Apache Hive入门

数据仓库基本概念 数据仓库&#xff0c;简称数仓&#xff0c;用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;分析结果为企业提供决策支持。 数据仓库本身并不生产任何数据&#xff0c;其数据来源于不同的外部系统同时数据仓库自…

Adobe Acrobat XI 一进去就闪退;解决Acrobat的闪退问题

一、原因分析 闪退是因为网络中校验版权时出现问题 二、解决办法 域名欺骗&#xff0c;添加伪造的host条目 1. 进入C:\Windows\System32\drivers\etc 找到hosts文件 2. 右机hosts&#xff0c;选择属性&#xff0c;在安全选项里&#xff0c;点击高级&#xff1a; 3. 在ho…

C++——哈希

文章目录1. unorder无序1.1unordered_map文档介绍接口说明1.2 unordered_set2.哈希常见的哈希函数2.1 直接定址法--(常用)2.2 除留余数法--(常用)(1).闭散列——开方定址发&#xff08;已被淘汰&#xff09;a.线性探测——冲突越多效率越低。b.二次探测(2).开散列——拉链法/哈…

深入浅出synchronized关键字

前言 无论在日常工作还是面试过程中&#xff0c;synchronized关键字作为并发场景下的操作&#xff0c;是一定要掌握的&#xff0c;本文从synchronized的使用方式、原理及优化三个方面&#xff0c;对synchronized关键字作一个系统化的说明。 使用方式 synchronized主要有三种…

Java: static,final,代码块 的详解

Java: static&#xff0c;final&#xff0c;代码块 的详解 每博一文案 山本文绪说过这样一句话&#xff1a;哪些决定放弃了的事&#xff0c;就请放弃得干干净净。哪些决定再也不见面的人&#xff0c;就真 的不要再见面了&#xff0c;不要再做背叛自己的事&#xff0c;如果想要…

操作手册(GB8567——88)基于协同的在线表格forture-sheet

操作手册&#xff08;GB8567——88&#xff09; 1引言 1.1编写目的 为了帮助用户更好的上手本系统&#xff0c;加快用户对forture-sheet在线表格的快速入门&#xff0c;本操作手册详细介绍使用forture-sheet的部分基础操作以及注意细节。 1.2前景 待开发系统的名称&#x…

ASP.NET开发的医疗健康咨询平台源码 养生知识咨询 寻根问药平台源码 C#源码

一、源码特点&#xff1a; 爱心医生健康知识门户网站是一个权威的医疗科普视频、语音、知识、医疗健康问答平台。 包含所有源代码和数据库&#xff0c;可以直接部署到IIS中使用。 二、菜单功能 网站页面&#xff1a; 1、首页&#xff1a;包含幻灯片。 2…

InnoDB详解2

文章目录InnoDB详解21 行格式1 Compact行格式详解1 变长字段长度列表&#xff08;两个字节&#xff09;2 NULL值列表&#xff08;1个字节&#xff09;3 记录头信息 &#xff08;重点&#xff09;2 Dynamic行格式2 页的上层结构InnoDB详解2 1 行格式 规定每条记录是怎么存储的…

解决资源消耗,top的运用记录

第一条命令uptime load average 后面的三个数字&#xff0c;分别代表1分钟、5分钟和15分钟内机器的平均负载 使用top命令解决负载问题 Cpu(s)这一行提供了CPU运行情况信息 这些缩写分别代表了不同含义 (1)us&#xff1a;用户CPU时间 运行非优雅的用户进程所占CPU时间的百…

Python学习笔记(十九)——Matplotlib入门上

目录 Matplotlib简介 导入matplotlib模块 图的参数说明 matplotlib图像组成部分介绍 matplotlib绘图步骤分析 matplotlib实现简单图像 matplotlib画布 画布-plt.figure() 实例 同一画布制作多张图像 创建多个子图 实例 plt.subplots 相关参数 调整subplot周围的间距…

简单记录一下怎么看package.json文件

首先每个vue工程文件从仓库克隆代码下来的时候&#xff0c;一般都会包含这个文件&#xff0c;这个文件非常重要&#xff0c;package.json包含了关于项目重要信息&#xff0c;如下图所示 其中包含了name、version、description、author、scripts、dependencies、devDependencies…

小结 | 决策树

一.基本原理 决策树是一种树状结构模型&#xff0c;每一个根节点都是一个特征判断&#xff0c;它的叶子节点就是它的特征分类结果 决策树是一种分类和回归的基本模型&#xff0c;是一棵树的形式&#xff0c;其实就是将平时所说的 if-else 语句构建成了树的形式。决策树主要包…

短视频引流+私域流量沉淀,一个全新的短视频和链动模式结合方案

在微盟企微助手微盟智慧零售团队的协助下&#xff0c;今年7月底么么茶正式开始运营企微私域&#xff0c;截至当前&#xff0c;在短短3个月时间已成功沉淀7万私域客户&#xff0c;线上商城GMV超145万。 么么茶旅拍的核心流量来源自公域短视频平台&#xff0c;品牌基于服务覆盖下…

deck.gl 调研

0 结论 deck gl 是基于 WebGL 的数据可视化框架&#xff0c;可以集成在主流的地图框架&#xff08;arcgis&#xff0c;google maps&#xff0c;mapbox &#xff09;中使用&#xff0c; 也可以单独使用。 deck gl 通过layer进行数据可视化&#xff0c;支持多种展示效果&#xf…

ASP.NET开源版MES加工装配模拟系统源码/WinForm工厂加工装配系统源码/流程工序管理

一、源码描述 本系统用户大学机械科上位机加工装配模拟实验&#xff0c;目前正常用于实验当中。环境&#xff1a;VS2010(C# .NET4.0,多层结构)、sqlserver2008 r2 &#xff1b;Winform;使用到RFID读写器&#xff08;设备是可以变更的&#xff0c;修改RFID.Library项目的…

数字三角形问题

数字三角形问题一、题目描述二、题目分析1、问题分析2、思路分析&#xff08;1&#xff09;状态转移方程状态表示状态转移&#xff08;2&#xff09;循环的设计三、代码实现一、题目描述 二、题目分析 1、问题分析 这道题给我们的第一眼感觉就是情况太多了&#xff0c;太复杂…