最新要闻
- 向佐晒儿子周岁宴,现场紧搂郭碧婷秀恩爱,儿女露正脸都是高颜值_快资讯
- 江淮钇为3上市:最长续航600公里、8.99万元起_天天资讯
- 酷睿Ultra来了!Intel史上最混乱一代 还有马甲
- 谨慎下载 Win10 ISO镜像被黑客下马:攻击手法罕见_环球热消息
- 报道:博尔特4x100
- 今日热文:手握手的承诺 心贴心的服务_手握手
- 男孩玩氢气球砸到吹风机爆燃 妈妈被严重烧伤:画面触目惊心
- 美国能源部资助Intel 1220万元:开发2000W散热技术-天天热资讯
- 狂喝红牛能抗老?
- 不忘挖井人!奔驰Vision One-Eleven概念车首发:致敬经典实验车|天天速读
- 刷新纪录!41颗卫星共乘一枚火箭座位怎么排:全靠它了
- 精选!蜂蜜的种类
- 港人北上消费升温 香港零售业对人流量持乐观态度_世界新消息
- 世界百事通!理想MPV设计手稿曝光 李想:设计灵感不是和谐号 而是鲸鱼
- 女儿高考完提出3个要求妈妈崩溃:养了个祖宗|天天速看
- 土星卫星首次发现高浓度磷元素 地外生命真的存在?
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【世界快播报】Kotlin协程-从一到多
上一篇文章,我介绍了Kotlin协程的创建,使用,协作等内容。本篇将引入更多的使用场景,继续带你走进协程世界。
(相关资料图)
使用协程处理异步数据流
常用编程语言都会内置对同一类型不同对象的数据集表示,我们通常称之为容器类。不同的容器类适用于不同的使用场景。Kotlin的Flow
就是在异步计算的需求下引入的,用于表示异步的数据流。
Flow
“问渠哪得清如许,为有源头活水来”,异步数据流的基本就是以某种方式获得异步数据。Kotlin提供了多种种方式,比较常用的就是Kotlin协程包的asFlow
扩展和flow
构造器。前者是对普通数据集的Flow
化封装,没有更多可言,我们着重来看后者。flow
构造器的主要目标就是产生一个异步数据流,它是一个泛型函数,参数是一个挂起函数,并且是FlowCollector
是扩展函数。这个接口只有一个emit
方法,就是为创建的Flow
提供异步计算的数据的,因为它是挂起函数,所以我们能在里面使用其他挂起函数计算异步值,然后通过emit
方法将值发送出去,如此反复就能为下游操作提供源源不断的数据流了。事情还没完,上面的步骤我们只是规定了创建数据的方式,并没有真正执行,也就是建好了道路,但是还没有车上路。那么,怎样才能让车在路上跑呢,查看Flow
的接口会发现,它提供了collect
方法来处理数据。collect
接收一个挂起函数作为处理逻辑,但是同时,collect
方法本身也是挂起函数,所以,这个方法只能在挂起函数中运行。有了这些知识,我们就可以写出最简单的异步数据流了。
1uspend fun compute():Int{ delay(123) return 1024 } viewModelScope.launch { val flow=flow { emit(9527) emit(compute()) delay(256) emit(256) } flow.collect { println(it) }}
在flow
构造器里面随意做各种操作,只要在必要的时候传递结果就行了,但是需要注意的是,emit
方法只能运行在同一个协程里。乍一看,这样分开写和写在一起并没有本质上的差别,但Flow
还能做到更多。
该给Flow换个工作环境了
上一节,我们那个简单的示例,假如把构造器里面的数据获取方法换成网络请求,应用就歇菜了。因为它们都是运行在主线程里面的。那么这个时候,看过上一篇文章的小伙伴马上就会反应过来,用withContext
方法在构造器里面切换线程就行了哇。思路是很对,因为Flow
的默认配置就是构造器和collect
方法工作在同一线程,既然现在主线程不让运行,那就把构造器的线程切换一下就行了呗。然后事实并不是这样,这样写出来的代码根本无法运行。因为官方提供了唯一的flowOn
方法来切换构造器的执行线程。使用也很简单,就是对创建好的Flow
对象配置一次flowOn
方法就行了。
val flow=["1.jpg","2.jpg"].asFlow()flow.map { decode(it) } .flowOn(Dispatchers.IO)viewModelScope.launch { flow.collect{ adapter.add(it) }
有些中间处理逻辑
熟悉RxJava的小伙伴可能有疑问了,这些操作RxJava也能完成,甚至还有更多的操作符来支持中间状态的处理,那么异步数据流能做到这些吗。毫无疑问,它可以。普通的数据集有map
,filter
等操作方法,对于异步数据流来说,这些方法同样适用。而且这些方法参数都是挂起函数,都可以执行异步操作。而且它还有个更灵活的transform
方法,这个方法可以定制自己的操作符,实现更灵活的数据操作。
当然,上面那些操作符都只能实现单一异步流的操作,对于多数据流的支持,它也同样不在话下。zip
可以将两个两个数据源两两合并起来,合成的数据流长度为两个数据流中最短的那个数据流的长度。combine
则与zip
不同,它会将两个数据流最近的发送数据作为输入,也就是说,假如一块一慢的两个数据源,慢的数据源的元素可能会被多次取到,从而最终的数据流比最短的那个都长。
val flow = flowOf(1, 2).delayEach(10)val flow2 = flowOf("a", "b", "c").delayEach(15)flow.combine(flow2) { i, s -> i.toString() + s }.collect { println(it) // Will print "1a 2a 2b 2c"}
结束状态跟踪
上一节提到,由于数据源和处理逻辑不在同一个地方,所以很难确定最终的数据流大小,进而不知道数据流什么时候处理结束。而且中间操作也可能会改变数据流的大小,由此就更加难以确定数据处理结束的时机了。但是我们有的时候却需要在数据处理完成后做一些操作,该怎么办呢?这个时候当然是该onCompletion
方法上场了。这个方法有一个可为空的Throwable
类型参数,很显然,这可以同时指示两种处理结果,成功或者失败,失败就会将异常对象传递进来。
多个协程共同工作
很多时候,避免不了让多个协程共同工作。对于返回单个值的协程,上一篇我们也提到过了,可以传递async
构造器的返回对象Deferred
,但是局限性就是这个对象只能传递一个值。针对多值传递的情况,Kotlin提供了Channel
的解决方法。Channel
类似于阻塞队列,数据通过send
方法发送出去,在另外的地方使用receive
方法接收。通过这种方法,我们可以极大提供协程的工作效率。利用它就可以轻松实现生产者和消费者模型。
val chanel=Channel() viewModelScope.launch(Dispatchers.IO) { for (i in 1..5){ delay(1000) chanel.send(i) } } viewModelScope.launch { for (i in chanel){ println("Handle ${i}") }}
当然,这只是最简单的用法,还可以加入更多的生产者,或者不再需要数据时取消,甚至还有专门的product
构造器,直接获得返回多个值的协程对象。
总结
Kotlin协程有很多有用的API,这些API覆盖了大部分异步使用的场景。所以在使用协程的时候,我们首先需要明确使用场景,再根据使用场景确定使用哪一套API,这可以使我们避免陷入API恐惧症。为此,我根据这两篇文章的内容,整理出了一份情景表格,实际开发中可以参照使用。Kotlin协程构造器
API | 使用场景 |
---|---|
launch | 执行耗时操作,不需要返回值 |
async | 需要获取耗时操作的单个返回值 |
produce | 需要获取耗时操作的多个返回值 |
Kotlin协程协同工具
API | 使用场景 |
---|---|
Flow | 操作异步数据流 |
Channel | 协程间通信 |
青山不改,绿水长流,咱们下期见!
关键词:
【世界快播报】Kotlin协程-从一到多
金科地产8.8亿元债券本息未按期偿付 持有人会议仍在表决中 新动态
向佐晒儿子周岁宴,现场紧搂郭碧婷秀恩爱,儿女露正脸都是高颜值_快资讯
江淮钇为3上市:最长续航600公里、8.99万元起_天天资讯
酷睿Ultra来了!Intel史上最混乱一代 还有马甲
谨慎下载 Win10 ISO镜像被黑客下马:攻击手法罕见_环球热消息
报道:博尔特4x100
LGV引理
【世界新要闻】Docsify on VPS,搭建最简个人博客
先正达集团IPO过会 沪市主板即将迎来全球农业龙头企业
今日热文:手握手的承诺 心贴心的服务_手握手
男孩玩氢气球砸到吹风机爆燃 妈妈被严重烧伤:画面触目惊心
美国能源部资助Intel 1220万元:开发2000W散热技术-天天热资讯
狂喝红牛能抗老?
不忘挖井人!奔驰Vision One-Eleven概念车首发:致敬经典实验车|天天速读
刷新纪录!41颗卫星共乘一枚火箭座位怎么排:全靠它了
精选!蜂蜜的种类
结案了!in到底用不用索引,啥时候能用啥时候不能用-天天新消息
lua中 . 和 : 的区别
港人北上消费升温 香港零售业对人流量持乐观态度_世界新消息
前沿资讯!欧盟机构:6月初全球平均气温创纪录
世界百事通!理想MPV设计手稿曝光 李想:设计灵感不是和谐号 而是鲸鱼
女儿高考完提出3个要求妈妈崩溃:养了个祖宗|天天速看
土星卫星首次发现高浓度磷元素 地外生命真的存在?
美商海盗船发布新款DARKSTAR鼠标:15个可编程按键
2399元的RTX 4060即将开卖 专家称英伟达还得涨:显卡份额突破76%
[路演]金杨股份首次公开发行股票并在创业板上市网上路演今日在全景网成功举办
世界简讯:网易云心动模式为什么会播不是喜欢的音乐(网易云的心动模式在哪)
元数据在数字化时代中的应用与发展
记录--设计一个可选择不连续的时间范围的日期选择器
聊聊Flink的必知必会(三)
【活动访谈】发力数字基座 推动物联创新—航天科技控股集团AIRIOT4.0平台发布会活动专访 天天短讯
即时焦点:曝光!Apache SeaTunnel Catalog 功能设计为何能大大简化用户启用步骤?
财政部:1-5月全国一般公共预算收入同比增长14.9% 一般公共预算支出同比增长5.8%
新美男记_关于新美男记简介
当前资讯!高考考生们这些“套路”骗局要当心:千万别信
环球观热点:小哥十米高跳江救人!老家张家界奖励10万元外加一套房
16针显卡供电接口闯大祸!第一次把电源烧了
全球实时:HDD硬盘被垄断 倪光南院士:SSD取代的时机到了
iPhone 15 Pro Max影像这下拉满了!看不到短板
景区观光车这价格,吃相太难看了
环球热讯:两部门印发文件部署高校毕业生档案转递接收工作
Kubernetes 1.27.2集群安装|每日热讯
单体服务,微服务服务的演变 & 各自优缺点
世界观焦点:javaScript基础语法之正则表达式
国网集安市供电公司:开展端午节前作风建设监督检查
世界要闻:比法拉利更抢眼!理想设计师亲自“泄密” W01设计手稿公布
苦中作乐!广东暴雨积水成河:有人屋内钓鱼 外卖车成水上摩托-当前滚动
快报:顾客遇账单刺客8碗米饭要90元 餐厅反驳:为了拍段子蹭流量
热到怀疑人生!今年“烧烤模式”来得早
每日视讯:RTX 4080显卡杀到8399元 铭瑄618全程价保:硬核装备开抢
FOreverLove什么意思中文
全球热门:远程办公篇-vscode远程SSH开发
和必应对话之mysql分区分表
天天日报丨位运算与集合
镜像,容器,容器数据卷,DockerFile 相关命令 使用总结 全球资讯
今日视点:胸部怎样才算不下垂_胸部怎样才能变大
全球今日讯!Facebook首席AI专家表示, 大语言模型只是昙花一现
好多明星去看了梅西比赛:陈妍希、苏醒等人都在现场_全球快播
世界看热讯:余承东:比亚迪是未来能活下来的巨头之一 华为能帮车企活下来
余承东:问界M5智能驾驶能力全球第一 超越特斯拉、国内外所有同行 天天快播
李一男造车梦“复活”自由家NV换标大乘V07已通过工信部申报
全球要闻:一口降温夏日必备!迷你可爱多冰淇淋官旗发车:每支不到1块钱
【天天速看料】邓一杰:黄金破1962,保守调仓,激进持仓!
当前头条:冬天适合在室内养什么植物_冬天室内养什么植物好 冬天适合室内种植的植物介绍
梅西ins发文感谢中国粉丝:开场81秒就进球 打破职业生涯记录 快看点
离谱!代驾设套碰瓷13名代驾同行:故意选土路蹭底盘 世界快消息
梅西直播被吐槽广告多?回应来了:纯聊天 没有带货_每日热议
苹果iPhone为何只有27W充电?原因可能有三 焦点速读
韩媒:韩国年轻人迷上中国App无法自拔 实在太好用了-全球讯息
速看:液冷概念股震荡走高 飞龙股份拉升封板
天天微头条丨CHAT-GPT初使用
唐源电气6月16日盘中跌幅达5%
男子突发奇想将甜瓜和西瓜嫁接 网友看完大笑:这是焊接_每日观察
环球观焦点:交通拥堵为何不禁私家车?这座一线城市要限电动自行车 只是试运行 专家吐槽
罕见!巨鸟撞碎玻璃卡在飞机舱,飞行员满脸血仍淡定驾驶……_全球今热点
热点!从0开始,精通Go语言Rest微服务架构和开发
Apache Spark教程_编程入门自学教程_菜鸟教程-免费教程分享
Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件
【环球聚看点】实力登场 汉马动力携四款动力产品亮相上海GPOWER 2023动力展
陕西加强养老服务设施规划建设新建城区 新建居住(小)区配建养老服务设施
员工没完成业绩被罚吃苦瓜 公司:激励团队 都是自愿的
最新消息:买2套到手23件:黑人好来超白茶牙膏套装5支39.9元
坦克300坐不住了 全新一代北京BJ40曝光 你会选谁?
环球观热点:RTX轻薄本怎么选?不妨看看这三款:13499元的华硕灵耀Pro14 2023无可挑剔
世界观察:维珍银河计划月底进行首次商务飞行:数百名旅客将上太空
车祸轻伤害要求赔偿多少
每日快看:MySQL索引优化与查询优化
直播源码搭建平台技术知识:实时语音识别字幕呈现功能
有没有类似天龙八部的游戏_类似天龙八部的网络游戏|当前报道
赤座茜出场_赤座茜
滴滴发布橙意保障计划:9成网约车司机月均抽成低于20%
私人山庄被网红闯入并造谣为鬼屋吓得房主不敢回了 网友:请严惩_热闻
梅西回应被迫“宅”酒店 酒店外的球迷太疯狂:感谢所有中国球迷 环球资讯
新资讯:问界M5智驾版交付 首位女车主还是兰博基尼、劳斯莱斯车主
两月没开电池报废不保修?极氪电池质保权益升级:砍掉不合理条约
prscrn键在惠普键盘上哪个位置(prscrn)
雪佛兰萨博班,出演1750部电影的明星车,磁力悬挂控制系统-天天短讯
视频编码耗时长、编码帧发送失败…DVPP视频编码问题典型案例分析
形式化分析之BAN逻辑