Kotlin Flow應用舉例,launchIn 和collect用法及區別

launchIn?和?collect?都可以用于處理?MutableStateFlow<Message>?消息流,但它們有不同的用途和使用場景。

collect?用于在協程中收集消息流的最新值。它會一直監聽消息流,并在每次消息流的值發生變化時執行指定的代碼塊。

launchIn?用于在協程作用域中啟動一個新的協程來收集消息流。它會創建一個新的協程,并在該協程中執行指定的代碼塊。

舉例說明:

假設我們有一個?MutableStateFlow<Message>,它用來存儲用戶輸入的消息,我們希望在每次收到新消息時,同時進行以下操作:

  1. 打印消息到控制臺。
  2. 將消息存儲到數據庫。

使用?collect:

import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlockingdata class Message(val content: String)fun main() {runBlocking {val messageFlow = MutableStateFlow<Message>(Message("初始消息"))// 使用 collect 在當前協程中收集消息流launch {messageFlow.collect { message ->println("收到消息:${message.content}")}}// 使用 collect 在當前協程中收集消息流launch {messageFlow.collect { message ->// 這里模擬將消息存儲到數據庫println("消息已存儲到數據庫:${message.content}")}}// 發送新消息messageFlow.value = Message("你好,世界!")messageFlow.value = Message("這是一個新的消息")}
}

使用?launchIn:

import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlockingdata class Message(val content: String)fun main() {runBlocking {val messageFlow = MutableStateFlow<Message>(Message("初始消息"))// 使用 launchIn 在新的協程中收集消息流messageFlow.onEach { message ->println("收到消息:${message.content}")}.launchIn(this)// 使用 launchIn 在新的協程中收集消息流messageFlow.onEach { message ->// 這里模擬將消息存儲到數據庫println("消息已存儲到數據庫:${message.content}")}.launchIn(this)// 發送新消息messageFlow.value = Message("你好,世界!")messageFlow.value = Message("這是一個新的消息")}
}

輸入:

  • 初始消息:Message("初始消息")
  • 新消息1:Message("你好,世界!")
  • 新消息2:Message("這是一個新的消息")

輸出:

兩種方法的輸出都相同:

收到消息:初始消息 消息已存儲到數據庫:初始消息 收到消息:你好,世界! 消息已存儲到數據庫:你好,世界! 收到消息:這是一個新的消息 消息已存儲到數據庫:這是一個新的消息

區別:

  • collect?會在當前協程中收集消息流,而?launchIn?會在新的協程中收集消息流。
  • collect?只能在協程中使用,而?launchIn?可以用于任何作用域,例如?CoroutineScope?或?Lifecycle
  • launchIn?可以用于啟動多個協程來處理同一個消息流,而?collect?只能啟動一個協程。

總結:

  • 如果需要在當前協程中收集消息流,可以使用?collect
  • 如果需要在新的協程中收集消息流,可以使用?launchIn
  • 如果需要啟動多個協程來處理同一個消息流,可以使用?launchIn

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14754.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【30天精通Prometheus:一站式監控實戰指南】第7天:postgres_exporter從入門到實戰:安裝、配置詳解與生產環境搭建指南,超詳細

親愛的讀者們&#x1f44b; ??歡迎加入【30天精通Prometheus】專欄&#xff01;&#x1f4da; 在這里&#xff0c;我們將探索Prometheus的強大功能&#xff0c;并將其應用于實際監控中。這個專欄都將為你提供寶貴的實戰經驗。&#x1f680; ??Prometheus是云原生和DevOps的…

Java基礎之異常(簡單易懂)

異常 1.JAVA異常體系 &#xff08;1&#xff09;Throwable類(表示可拋)是所有異常和錯誤的超類&#xff0c;兩個直接子類為Error和Exception,分別表示錯誤和異常;其中異常類Exception又分為運行時異常和非運行時異常&#xff0c;這兩個異常有很大區別&#xff0c;運行時異常也…

代碼隨想錄算法訓練營第三十一天| 貪心算法理論基礎、LeetCode455.分發餅干、LeetCode376. 擺動序列 、LeetCode53. 最大子序和

貪心算法理論基礎&#xff1a; 貪心算法沒有類似遞歸、回溯的套路。主要的思想可以理解為&#xff1a;用局部最優找全局最優。 #LeetCode 455. Assign Cookies #LeetCode 455. 視頻講解&#xff1a;貪心算法&#xff0c;你想先喂哪個小孩&#xff1f;| LeetCode&#xff1a;4…

魯教版六年級數學下冊-筆記

文章目錄 第五章 基本平面圖形1 線段、射線、直線2 比較線段的長短3 角4 角的比較5 多邊形和圓的初步認識第六章 整式的乘除1 同底數冪的乘法2 冪的乘方與積的乘方3 同底數冪的除法4 零指數冪與負整數指數冪5 整式的乘法6 平方差公式7 完全平方公式8 整式的除法 第七章 相交線與…

全域運營是割韭菜嗎?常見套路有哪些?

隨著全域運營賽道的全面開啟&#xff0c;全域運營服務商和全域運營系統的數量迅速增加&#xff0c;持續激發賽道活力的同時&#xff0c;也讓一些試圖用全域運營割韭菜的人有了可趁之機。 值得慶幸的是&#xff0c;由于當前全域運營賽道剛興起不久&#xff0c;因此&#xff0c;割…

Python | Leetcode Python題解之第110題平衡二叉樹

題目&#xff1a; 題解&#xff1a; class Solution:def isBalanced(self, root: TreeNode) -> bool:def height(root: TreeNode) -> int:if not root:return 0leftHeight height(root.left)rightHeight height(root.right)if leftHeight -1 or rightHeight -1 or a…

C++青少年簡明教程:If選擇語句

C青少年簡明教程&#xff1a;If選擇語句 C中選擇語句的語法是&#xff1a; if (條件) { 條件成立時需要執行的語句... } [else { 條件不成立時需要執行的語句... }] 說明&#xff1a; if后面使用一個括號&#xff0c;括號里是條件——關系表達式。 所謂的關系表達式就是判…

5.24學習記錄

[FSCTF 2023]ez_php2 比較簡單的pop鏈 <?php highlight_file(__file__); Class Rd{public $ending;public $cl;public $poc;public function __destruct(){echo "All matters have concluded";die($this->ending);}public function __call($name, $arg){for…

E1載波:一種2.048Mbps速率的PCM載波

E1載波的基本幀由32個子信道組成 幀長為256個bit,分為32個相等時隙&#xff0c;一個時隙為8個bit。256/328 時隙的編號為CH0~CH31 全幀包含256位,且每一幀用 125us時間傳送 E1載波支持的數據傳輸效率為2.048Mbps&#xff0c;用PCM編碼&#xff08;即 256bit/125us2.048Mbps…

Android 一個activity對應多個window

Android 一個activity對應多個window Android Activity 對應多個Window&#xff0c;Activity是應用程序的重要組成部分&#xff0c;在程序中的一個屏幕界面&#xff0c;用戶可以進行交互操作。在Android應用程序中&#xff0c;Activity對應著一個Window&#xff0c;一個Activi…

微信小程序源碼-基于Java后端的小區租拼車管理信息系統畢業設計(附源碼+演示錄像+LW)

大家好&#xff01;我是程序員一帆&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設…

洗完咖啡杯的最早時間

題目描述&#xff1a;給定一個數組arr&#xff0c;arr[i]代表第i號咖啡機泡一杯咖啡的時間&#xff0c;給定一個正數N&#xff0c;表示N個人在等著咖啡機&#xff0c;每臺咖啡機只能一個一個的泡咖啡&#xff0c;其次&#xff0c;只有一臺咖啡機可以洗杯子&#xff0c;一次只能…

1.OLED

1.基礎知識

kotlin重復類編譯報錯解決

Duplicate class org.jetbrains.annotations.TestOnly found in modules annotations-12.0 (com.intellij:annotations:12.0) and annotations-13.0 (org.jetbrains:annotations:13.0) Go to the documentation to learn how to <a href"d.android.com/r/tools 參考鏈…

網絡拓撲—DHCP服務配置

文章目錄 DHCP服務搭建相關配置細節前提安裝DHCP服務 DHCP服務搭建 相關配置細節前提 系統&#xff1a;Windows Server 2003 IP網段&#xff1a;10.0.0.0/24 三臺機子&#xff1a; 普通PC機 DHCP服務器 路由器&#xff08;兩塊網卡&#xff0c;連接內外網&#xff09; //注…

覆蓋索引與復合索引 小記

表 t_1 有一個復合索引 (user_id,create_time) 執行以下SQL SELECT COUNT(1) FROM t_1 WHERE create_time > 2024-01-10 AND create_time < 2024-05-25 ;看似不滿足復合索引最左前綴的條件,但依然會使用復合索引(user_id,create_time), 滿足覆蓋索引. 但如果是執行以…

【Unity】Unity項目轉抖音小游戲(三)資源分包,抖音云CDN

業務需求&#xff0c;開始接觸一下抖音小游戲相關的內容&#xff0c;開發過程中記錄一下流程。 使用資源分包可以優化游戲啟動速度&#xff0c;是抖音小游戲推薦的一種方式&#xff0c;抖音云也提供存放資源的CDN服務 抖音云官方文檔&#xff1a;https://developer.open-douyi…

基于灰狼優化算法優化支持向量機(GWO-SVM)時序預測

代碼原理及流程 基于灰狼優化算法優化支持向量機&#xff08;GWO-SVM&#xff09;的時序預測代碼的原理和流程如下&#xff1a; 1. **數據準備**&#xff1a;準備時序預測的數據集&#xff0c;將數據集按照時間順序劃分為訓練集和測試集。 2. **初始化灰狼群體和SVM模型參數…

LeetCode 47.全排列 II

LeetCode 47.全排列 II 1、題目 題目鏈接&#xff1a;47. 全排列 II 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,2] 輸出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff…

《基于Jmeter的性能測試框架搭建》改進一

《基于Jmeter的性能測試框架搭建》文末筆者提到了不少待改進之處&#xff0c;如下所示。 Grafana性能圖表實時展現&#xff0c;測試過程中需實時截圖形成測試報告&#xff0c;不夠人性化。解決方案&#xff1a;自動生成測試報告并郵件通知。 Grafana性能圖表需測試人員實時監控…