当前位置: 首页 > news >正文

在 Flow 取消时自动清理资源

Flow 的生命周期

1. Flow 什么时候会被取消?

 

// 场景1:Activity/Fragment 销毁sseClient.connect(url, token).launchIn(lifecycleScope) // lifecycleScope 在 Activity 销毁时会取消// 场景2:手动取消val job = sseClient.connect(url, token).launchIn(scope)job.cancel() // 手动取消// 场景3:超时或其他异常// Flow 内部发生异常时也会被取消

2. 取消时会发生什么?

 

fun connect(url: String, token: String): Flow<SSEEvent> = callbackFlow {// 1. 创建 HTTP 请求call = okHttpClient.newCall(request)// 2. 注册回调call?.enqueue(object : Callback {// ... 处理响应})// 3. 等待 Flow 被取消awaitClose { // 4. 当 Flow 取消时,这里会被执行disconnect() // 取消 HTTP 请求}}

具体流程演示

正常情况(用户正常使用)

 

// 用户打开页面initSSE(token) // 启动 SSE 连接// 用户使用过程中// SSE 持续接收数据...// 用户关闭页面// Activity 销毁 → lifecycleScope 取消 → Flow 取消 → awaitClose 执行 → disconnect() 被调用

异常情况(网络断开等)

 

// 网络断开// OkHttp 回调 onFailure// trySend(SSEEvent.Error(e))// close(e) // Flow 被关闭// 或者// 发生异常// Flow 被取消 → awaitClose 执行 → disconnect() 被调用

为什么需要 awaitClose?

没有 awaitClose 的问题

 

// ❌ 错误的写法

fun connect(url: String): Flow<SSEEvent> = callbackFlow {

    call = okHttpClient.newCall(request)

    call?.enqueue(callback)

    // 没有 awaitClose!

}

// 问题:

// 1. Flow 取消时,HTTP 请求还在后台运行

// 2. 可能继续接收数据,但没人处理

// 3. 造成内存泄漏

// 4. 浪费网络资源

有 awaitClose 的好处

 

// ✅ 正确的写法

fun connect(url: String): Flow<SSEEvent> = callbackFlow {

    call = okHttpClient.newCall(request)

    call?.enqueue(callback)

    

    awaitClose { 

        call?.cancel() // 确保 HTTP 请求被取消

    }

}

// 好处:

// 1. Flow 取消时,HTTP 请求立即被取消

// 2. 不会继续接收无用的数据

// 3. 释放网络连接

// 4. 防止内存泄漏

实际例子

 

// 用户快速切换页面class MainActivity : AppCompatActivity() {fun initSSE() {sseClient.connect(url, token).launchIn(lifecycleScope) // 绑定到 Activity 生命周期}}// 用户从 MainActivity 切换到 OtherActivity// 1. MainActivity.onDestroy() 被调用// 2. lifecycleScope 被取消// 3. SSE Flow 被取消// 4. awaitClose { disconnect() } 执行// 5. HTTP 请求被取消,资源被清理

总结

"在 Flow 取消时自动清理资源"的意思是:

  • 触发时机:Flow 被取消时(页面销毁、手动取消、异常等)
  • 执行内容:awaitClose 中的代码(您的 disconnect() 方法)
  • 作用:确保 HTTP 请求被正确取消,防止资源泄漏
  • 好处:自动管理资源,不需要手动处理

这就是为什么您的代码中 awaitClose { disconnect() } 很重要的原因!

http://www.dtcms.com/a/277473.html

相关文章:

  • 构建可落地的企业AI Agent,背后隐藏着怎样的技术密码?
  • vue是什么
  • 【读书笔记】《Effective Modern C++》第二章:auto
  • 改进后的 OpenCV 5.x + GStreamer + Python 3.12 编译流程(适用于 Orange Pi / ARM64)
  • 正则化-机器学习
  • Redis面试精讲 Day 2:Redis数据类型全解析
  • 内存管理概念
  • Docker安装Nginx
  • Web:JS的三种引用方式
  • 《每日AI-人工智能-编程日报》--2025年7月12日
  • Windows 常用命令
  • 网络编程 JAVA
  • 视觉语言导航与目标导航
  • 【银行测试】基金项目测试详细,测试点+面试(一)
  • ​​LangChain专家养成:工具扩展/Agent决策/记忆控制三维进阶
  • 250707脑电分析课题进展——EEGLAB的使用
  • 前端工程化-构建打包
  • 大模型-量化技术
  • 前端构建工具 Webpack 5 的优化策略与高级配置
  • [2025CVPR]DenoiseCP-Net:恶劣天气下基于LiDAR的高效集体感知模型
  • 神经网络的层与块
  • 掌握系统设计的精髓:12个核心设计模式的通俗解读
  • 【编程实践】利用open3d生成物体的最长边方向并可视化
  • 面向对象设计模式详解
  • CD49.【C++ Dev】容器适配器模式
  • 深入解析5G核心网容灾:UDM 故障场景下 SMF 容灾机制深度解析
  • C++ 单例模式实现
  • 【读书笔记】《C++ Software Design》第五章:The Strategy and Command Design Patterns
  • Java学习------设计模式(1)
  • ZKmall开源商城技术攻略:轻松掌握规则引擎与Spring Boot3接口的开发技巧