当前位置:网站首页>十九、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次
日志:

边栏推荐
- The operations engineer interview experience
- Connect to Mysql in the cloud server Docker detailed graphic and text operations (full)
- 冒泡排序、选择排序、插入排序、快速排序
- DVWA installation tutorial (understand what you don't understand · in detail)
- uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, syntax error
- "MySQL Advanced Chapter" four, the storage structure of the index
- MySQL存储引擎
- C#中对委托的理解和使用
- sqli-labs less3/4 Targeting Notes
- sql concat() function
猜你喜欢

Thread state of five
Go简单实现协程池

FastAPI 快速入门

JVM Learning (2) Garbage Collector

uni-app: The use of uni-icons and how to customize icons

C#利用开源NPlot实现K线图(蜡烛图)

SQL Server 数据库之生成与执行 SQL 脚本

Online sql editing query tool sql-editor

Mycat2.0搭建教程
![Monstache执行monstache -f config.toml出错No processor type exists with name [attachment] [type=parse_exc](/img/2d/50c9001125cd613087044d2b6c78b1.png)
Monstache执行monstache -f config.toml出错No processor type exists with name [attachment] [type=parse_exc
随机推荐
使用PyQt5为YoloV5添加界面(一)
MySQL window function
Misc-traffic analysis of CTF
Mycat2.0搭建教程
Bypassing the file upload vulnerability
[Ten years of network security engineers finishing] - 100 penetration testing tools introduction
Using PyQt5 to add an interface to YoloV5 (1)
uni-app: about custom components, easycom specs, uni_modules, etc.
【数仓】数据仓库高频面试题题英文版(1)
Calendar类的习题
Offensive and defensive world easy_web
MySQL 索引优化及失效场景
Defense Ideas for a Type of SMS Vulnerability
MySQL achievement method 】 【 5 words, single table SQL queries
FastAPI Quick Start
The operations engineer interview experience
TDengineGUI cannot connect to TDengine
[Mozhe Academy] Identity Authentication Failure Vulnerability Actual Combat
ClickHouse查询语句详解
史上超强最常用SQL语句大全