日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Coroutines Channels

發布時間:2024/9/30 Android 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Coroutines Channels 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/117674222
本文出自【趙彥軍的博客】

文章目錄

  • 依賴
  • channels 可以干啥
  • 數據模型
  • Channel的特點
  • Channel 分類
  • receive
  • consumeEach
  • 遍歷
  • close
  • Channel的協程Buidler(SendChannel / ReceiveChannel)
  • BroadcastChannel
  • Select
  • 其他方法

依賴

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'

channels 可以干啥

channels用于協程間的通信, 允許我們在不同的協程間傳遞數據(a stream of values).

數據模型

生產者-消費者模式

發送數據到channel的協程被稱為producer, 從channel接受數據的協程被稱為consumer.

當需要的時候, 多個協程可以向同一個channel發送數據, 一個channel的數據也可以被多個協程接收.

當多個協程從同一個channel接收數據的時候, 每個元素僅被其中一個consumer消費一次. 處理元素會自動將其從channel里刪除.

Channel的特點

Channel在概念上有點類似于BlockingQueue, 元素從一端被加入, 從另一端被消費. 關鍵的區別在于, 讀寫的方法不是blocking的, 而是suspending的.
在為空或為滿時. channel可以suspend它的send和receive操作.

生成數據,消費數據的方法都需要在協程里執行

Channel 分類

  • RENDEZVOUS :表示約會形式的等待,沒有緩存使用,send調用后就會一直掛起,直到receive到達。也是 Channel 默認形式。
  • UNLIMITED:表示執行緩存無限容量,容量是 Int.MAX_VALUE,send調用后就存放在channel里直接返回,不管是否有receive。但是我們在使用時還是需要注意內存情況。
  • CONFLATED:表示保留最新,send調用后就存放在channel里直接返回,但是channel里只能存放最近一次 send 的值。
  • BUFFERED:表示執行緩存使用默認容量,默認是64。

receive

在 Channel 有數據時接收數據,在 Channel 為空時處于掛起狀態,時刻準備接收數據。一旦接收完數據后,就執行完了

class MainActivity : AppCompatActivity() {private val channel = Channel<String>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById<View>(R.id.btn1).setOnClickListener {//發送數據GlobalScope.launch {channel.send("item1 ${System.currentTimeMillis()}")}}//接收數據GlobalScope.launch {repeat(10) {Log.d("channel", "receive--${channel.receive()}")}}}

consumeEach

class MainActivity : AppCompatActivity() {private val channel = Channel<String>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById<View>(R.id.btn1).setOnClickListener {//發送數據GlobalScope.launch {channel.send("item1 ${System.currentTimeMillis()}")}}//接收數據GlobalScope.launch {channel.consumeEach {Log.d("channel", "consumeEach--${it}")}}} }//輸出結果 D/channel: consumeEach--item1 1623123193526

consumeEach 會在接收到數據后,從把數據從隊列中移除。其他接收者,就不會再次接收了。也就是同一個數據,只能被一個數據接收

遍歷

kotlin 為我們提供了一個簡單的 channel 的遍歷方法,也就是 for 循環。
遍歷 channel 會一直處于掛起狀態,只要有數據,就會全部遍歷一次。沒有數據,處于掛起狀態。

class MainActivity : AppCompatActivity() {private val channel = Channel<String>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById<View>(R.id.btn1).setOnClickListener {//發送數據GlobalScope.launch {repeat(100) {channel.send("item1 $it")}}}//接收數據GlobalScope.launch {for (i in channel) {Log.d("channel", "$i")}}} }

close

不同于Queue,channel可以被關閉,對于channel的關閉,我們可以使用close(),關閉前發射的值將仍然能在接收端收到,接收端通過for循環來遍歷接收到的值。

如果執行了 close 以后,還調用 send 方法,就會崩潰

所以一種比較安全的做法是,在 send 之前,要判斷一下channel 是否已經關閉了

//發送數據 GlobalScope.launch {if (!channel.isClosedForSend) {channel.send("item1 ${System.currentTimeMillis()}")} }

Channel的協程Buidler(SendChannel / ReceiveChannel)

我們在上面示例中可見,通過一個生產者協程producer和一個消費者協程consumer進行了數據的send和receive,而在官方框架中也專門為生產者協程和消費者協程提供了兩個函數來構建出協程,它們就是produce和actor。

而且通過produce和actor函數啟動的協程結束后都會自動關閉對應的Channel。

  • produce:啟動一個生產者協程,返回ReceiveChannel。

  • actor:啟動一個消息者協程,返回SendChannel(注意,actor函數目前框架中是被標為廢棄)。

示例如下:

BroadcastChannel

前面介紹的Channel的所發送的數據只能被一個消費者消費,而如果需要一對多的話那就需要BroadcastChannel,它會像我們平時使用廣播一樣進行分發給所有訂閱者。

另外需要注意的是,BroadcastChannel不支持RENDEZVOUS。

Select

Select一般是IO多路復用的概念,而在協程的Select則是用于掛起函數的多路復用。通俗一點表達就是可以同時進行多個掛起函數的調用,但最后只選擇執行最快的掛起函數的返回結果。


其他方法

channel.isClosedForSend //發送通道是否關閉 channel.isClosedForReceive //接收通道是否關閉 channel.isEmpty //是否為空

總結

以上是生活随笔為你收集整理的Android Coroutines Channels的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美乱妇视频 | 福利一区视频 | 综合在线播放 | 视频一区二区在线 | 激情自拍偷拍 | 欧美草比视频 | 夜夜骑av | 在线一区二区三区视频 | 91丝袜美腿 | 精品三级在线观看 | 成人午夜视频免费在线观看 | 黄色av一区 | 日韩黄色免费看 | a级特黄视频 | 蜜桃视频无码区在线观看 | 极品久久久久久 | 91成人短视频 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 伊人影院在线播放 | 亚洲麻豆 | 亚洲好看站 | 三级黄色片免费 | 国产自产一区二区 | av导航网 | 奇米综合网 | 中文字幕欧美另类精品亚洲 | 国产精品呻吟久久 | 在线免费观看国产视频 | 国产a级精品 | 久久久精品久 | 香蕉网在线播放 | 国产午夜精品视频 | 一眉道姑| 日本一区二区三区视频在线观看 | 精品xxxx| 国产精品成人国产乱一区 | 日本xx视频免费观看 | 国语对白做受按摩的注意事项 | 久久这里只精品 | 日韩一级二级三级 | 深爱开心激情网 | www.四虎. | 亚洲同性gay激情无套 | 日本一本二本三区免费 | 一区二区三区小说 | 中文字幕免费高 | 两口子交换真实刺激高潮 | 在线免费亚洲 | 久久久久久亚洲av毛片大全 | 少妇高潮露脸国语对白 | 久久天天| 爽妇综合网| 一级片免费在线观看 | 91看片免费版 | 国产草草视频 | 欧美黄色精品 | 国模大尺度自拍 | 337p粉嫩色噜噜噜大肥臀 | www.黄色小说.com | 亚洲视频天堂 | www.亚洲综合 | 一女被多男玩喷潮视频 | 在线www色| av高清 | 一级黄色毛毛片 | 天天干夜夜夜 | 亚洲欧美动漫 | 成人精品电影 | 日韩美女视频19 | 国产美女网 | 美女福利一区 | 69免费| 91香蕉视频在线看 | 69精品无码成人久久久久久 | 蜜臀av性久久久久蜜臀aⅴ | 欧美女人天堂 | 国产黄色片在线播放 | 国产一区不卡在线观看 | 91激情 | 欧美性生活一区 | 亚洲中出| 日本大片黄 | 久久97久久97精品免视看 | 日本国产在线观看 | 国产精品无套 | 成人精品亚洲 | 成人亚洲黄色 | 91精品免费看 | 亚洲操片 | 国产美女主播在线观看 | 少妇熟女一区二区三区 | 69视频网址| 国产一区美女 | 国产视频在线看 | 青娱乐在线视频免费观看 | 亚洲青春草 | 精品国产户外野外 | 一本加勒比波多野结衣 | 天堂免费在线视频 |