日韩性视频-久久久蜜桃-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麻豆精品国产91久久久久久久久 | 无码精品国产一区二区三区免费 | 欧美高清精品 | 日韩精品自拍 | 国产在线播放一区 | 风韵多水的老熟妇 | 日韩在线视频二区 | 91日本视频 | 亚洲大尺度视频 | 精品成人一区二区 | 日本免费一二三区 | 久爱视频在线 | 午夜精品一区二区三区在线 | 91黄色免费网站 | 91最新入口 | 一区免费在线 | 免费在线观看小视频 | 一区二区在线视频播放 | 成人wwwww免费观看 | www.玖玖玖 | 亚欧洲精品在线视频免费观看 | 波多野结衣网站 | 国产aⅴ精品一区二区三区久久 | 亚洲蜜桃在线 | 日本一区二区三区四区五区 | 思思久久99 | 亚洲天堂中文字幕在线观看 | 性奶老妇 视频 | 国产欧美一区二区三区视频在线观看 | 欧美高清x| av毛片在线免费看 | 操她视频在线观看 | 国产高清在线免费 | av性天堂网 | 噜噜吧噜噜色 | 欧美性猛交xxxⅹ富婆 | 亚洲精品视频一区二区三区 | 日本一区高清 | 亚洲精品一区二区三区影院忠贞 | 亚洲国产黄色片 | av中文资源 | 观看免费av| 成年人黄色免费网站 | 99久久精品免费 | 亚洲精品爱爱 | 日韩污视频在线观看 | 日韩欧美一区二区三区视频 | 国内精品久久久久久久久久久 | 天天干天天操天天摸 | 免费观看nba乐趣影院 | 精品女同一区二区三区 | 亚洲综合99| 一区二区三区四区在线 | 老司机在线精品视频 | 亚洲熟女乱色一区二区三区 | 999国产视频 | 久久午夜福利电影 | 国产一区二区视频免费在线观看 | 女人叫床高潮娇喘声录音mp3 | 久久理伦| 在线综合视频 | 久久国内视频 | 一区二区三区四区免费观看 | 伊人久久一区 | 毛片综合 | 欧美黑人性猛交xxxx | 91国自啪 | 中文字幕在线日本 | 亚洲国产av一区 | 男人操女人逼逼视频 | 九九九九热| 激情成人综合网 | 日韩欧美在线免费观看 | 天天干夜夜操视频 | 在线免费av网址 | 成人一二三四区 | 日本三级中国三级99人妇网站 | 男女毛片视频 | 好吊视频在线观看 | 韩国三级bd高清中字2021 | 五月天国产在线 | 欧美久久久 | 国产黄色自拍 | 好吊妞视频在线观看 | 菊肠扩张playh | 日本中文字幕高清 | 久久久久久香蕉 | 激情视频网站 | 大香伊人 | 欧美黄色片视频 | 一区二区三区亚洲精品 | 超碰福利在线观看 | 夜夜爱av | 青青91| 国产精品一区在线观看 | 污视频网站免费在线观看 | 都市激情亚洲一区 |