当前位置:网站首页>十九、Kotlin进阶学习:1、管道数据的收和发;2、管道的关闭;3、生产者和消费者;4、管道的缓存区;
十九、Kotlin进阶学习:1、管道数据的收和发;2、管道的关闭;3、生产者和消费者;4、管道的缓存区;
2022-07-30 05:43:00 【¥伊人独醉】
1、管道数据的收和发;
我知道通过async可以启动一个协程,再通过await可以获得协程返回的值。async返回的是一个deffered对象,表示是一个延迟的对象,所谓延迟的意思就是当时拿不到值,之后执行完毕可以获取值。
kotlin除了提供async和await这种模式外,还可以通过管道来实现数据延迟获取。提供了channel这个对象作为管道实现send和receive来进行数据发送和接收。
【案例】
对比:async和await实现请求和返回。
步骤:
(1)建立channel
(2)使用channel发
(3)使用channel收

日志:
【案例】 将收和发拆分成2个按钮
activity_main.xml

MainActivity.kt
测试1:先点“收”,再点“发”
测试2:先定“发”,再点“收”
【案例】使用async和await如何模拟管道的收发
步骤:
(1)定义挂起函数
(2)使用async启动挂起函数
(3)使用async执行4次
(4)send相当于async,receive相当于await
参考:

日志:
2、管道的关闭;
管道如何关闭?
使用channel.close()方法来关闭
什么时候关闭?
当没有更多数据传递时,就可以关闭管道。管道的启用会耗费更多资源,关闭后可以释放资源。
【案例】关闭管道

日志:
注意:
(1)当接收端还打算接收数据,而管道被关闭,会抛出异常:closedReceiveChannelException
(2)为了让接收端依然可以接收数据了,可以选择不关闭管道,但是会耗费更多的资源。
3、生产者和消费者;
实际上软件的设计模式。
无论是async和await
还是channel中的send和receive
都是生产者与消费者之间的关系。这些模式可以总结为生产者和消费者模式。
Kotlin提供了这一模式。
【案例】

日志:
【案例】将生产者、消费者分别放到不同按钮中


日志:
4、管道的缓存区;
默认管道是没有缓存区的,我们发现发送数据就必须得接收,只有接收一个,才能接着发送下一条数据。发送完信息之后,没有被接收,此时程序就会暂停在这个地方,不是阻塞,属于挂起,等到接收完毕之后会继续放松消息。接收端一样,如果没有数据发送过来,此时程序就暂停,直到有新的数据发送过来才会继续接收,也不是阻塞,而是挂起。
创建channel可以指定channel的capacity,表示缓存区的大小,缓冲区在发送者挂起之前可以根据capacity缓存多个消息。接收端也可以接收缓存区的数据。
【案例】


日志:

测试1:修改capacity为0,

观察日志:
测试2:删除46行,没有挂起函数


【案例】建立2个按钮,一个发,一个收,支持缓存区


测试:
发的按钮点1次
收的按钮点4次
日志:

边栏推荐
猜你喜欢

使用PyQt5为YoloV5添加界面(一)

mysql不是内部或外部命令,也不是可运行的程序或批处理文件解决

uni-app: about custom components, easycom specs, uni_modules, etc.
Go简单实现协程池
![[Mini Program Project Development--Jingdong Mall] Classification Navigation Area of uni-app](/img/cb/b0b79444dc90980cd2220ff9e68549.png)
[Mini Program Project Development--Jingdong Mall] Classification Navigation Area of uni-app

MySQL 5.7 installation tutorial (all steps, nanny tutorials)

SQL Server安装教程

Nacos配置中心用法详细介绍

MySQL开窗函数

Monstache执行Monstache - f配置。toml出错不存在处理器类型和名称(附件)(= parse_exc类型
随机推荐
Mysql 客户端常见异常分析
mysql不是内部或外部命令,也不是可运行的程序或批处理文件解决
Oracle数据库SQL优化详解
Flink PostgreSQL CDC configuration and FAQ
sql concat()函数
torch distributed training
利用自定义注解,统计方法执行时间
Jackson 序列化失败问题-oracle数据返回类型找不到对应的Serializer
【OS】操作系统高频面试题英文版(1)
史上超强最常用SQL语句大全
Arthas 命令解析(jvm/thread/stack/heapdump)
Nacos配置中心用法详细介绍
A Spark task tuning 】 【 one day suddenly slow down how to solve
2022CISCNmisc
使用PyQt5为YoloV5添加界面(一)
Flink CDC implements Postgres to MySQL streaming processing transmission case
[Mozhe Academy] Identity Authentication Failure Vulnerability Actual Combat
c#下Web3合约空投、转账调用代码
Reasons and solutions for Invalid bound statement (not found)
学生成绩管理系统(C语言版)