十九、Kotlin进阶学习:1、管道数据的收和发;2、管道的关闭;3、生产者和消费者;4、管道的缓存区;

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次

日志:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

¥伊人独醉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值