首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

一文吃透Kotlin中冷流(Clod Flow)和热流(Hot Flow)

  • 25-04-16 14:00
  • 4251
  • 12425
juejin.cn

一、冷流(Cold Flow)

特点:

  • 按需触发:只有调用 collect() 时,才开始生产数据。
  • 独立副本:每个新的订阅者都会触发完整的数据流从头开始。
  • 典型代表:flow { ... }、asFlow()。

冷流示例代码:

Kotlin
代码解读
复制代码
//每次collect都会重新发射数据 val coldFlow = flow { println("开始生产数据") //每次collect都会执行 emit(1) emit(2) } // 第一个订阅者 coldFlow.collect { println("订阅者1: $it") } // 输出:1,2 // 第二个订阅者 coldFlow.collect { println("订阅者2: $it") } // 再次输出:1,2

适用场景:

  • 如网络请求、数据库查询,即需要独立数据源场景。
  • 每个订阅者需要从头消费完整的数据。

总结:

冷流像【点播电影】,你点播才开始播放,不同观众各自从头开始看。

二、热流(Hot Flow)

特点:

  • 主动发射:不管有没有订阅者,数据都会产生。
  • 共享数据源:多个订阅者共享同一份数据流,但只能收到订阅后的数据。
  • 典型代表:SharedFlow、StateFlow。

热流示例代码:

Kotlin
代码解读
复制代码
// 创建热流(SharedFlow) val hotFlow = MutableSharedFlow<Int>() // 启动协程持续发射数据(即使没有订阅者) CoroutineScope(Dispatchers.Default).launch { repeat(3) { delay(1000) // 发射 0 1 2 hotFlow.emit(it) } } // 第一个订阅者(延迟1秒订阅) CoroutineScope(Dispatchers.Main).launch { delay(1000) hotFlow.collect { println("订阅者1: $it") } // 只能收到 1,2 } // 第二个订阅者(延迟5秒订阅) CoroutineScope(Dispatchers.Main).launch { delay(5000) hotFlow.collect { println("订阅者2: $it") } // 收不到任何数据(发射已结束) }

适用场景:

  • 需要共享实时数据的场景(如IM消息、用户定位更新)。
  • 多个订阅者需要获取同一份动态数据(如全局状态管理)。

总结:

热流像【直播】,不管你看不看,节目都在进行,中途进入的只能从当前内容开始看。

三、 冷流(Cold Flow) vs 热流(Hot Flow)

冷流(Cold Flow)热流(Hot Flow)
数据发射时机按需触发(有订阅才发射)主动发射(不管有没有订阅)
数据独立性每个订阅者获取独立副本所有订阅者共享同一数据源
数据历史新订阅者从头获取完整数据新订阅者只能获取订阅后的数据
典型用例单次网络请求、文件读取实时状态更新、事件总线
资源消耗每次订阅都重新执行逻辑(重复耗时)单次数据源共享(节约资源)

开发中如何选择使用冷/热流?

冷流(私人订制):

  • 每个订阅者需要独立完整的数据(如每次打开页面都重新请求最新数据)。
  • 数据生产逻辑需要按需触发(如按钮点击才加载数据)。

热流(直播):

  • 需要多个订阅者共享实时数据(如全局登录状态)。
  • 数据生产是持续且独立的(如实时定位数据、传感器数据、WebSocket消息)。

更多分享

  1. # 一文带你吃透Kotlin协程的launch()和async()的区别
  2. Kotlin日常高效编程技巧和作用域函数的使用。
注:本文转载自juejin.cn的QING618的文章"https://juejin.cn/post/7472765834964910120"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top