返回首页

Kotlin for Android 中的 Structured Concurrency

这篇文章使用 JetBrains 专家对 GeminiAI 的审计示例,分解了 Kotlin 中的 Structured Concurrency。描述了上下文继承、等待完成和任务取消的规则。在 Android 的 ViewModel 和 Repository 中的应用,避免内存泄漏。

Kotlin 专家如何检查 GeminiAI:Structured Concurrency
Advertisement 728x90

Kotlin结构化并发:JetBrains专家GeminiAI审计的启示

开发者Shamil Gilmetov邀请JetBrains认证培训师兼Kotlin书籍作者Marcin Moskała对其GeminiAI项目——一个Gemini的Android客户端——进行了详细审计。该项目使用Navigation3、Jetpack Compose、Coroutines和Flow实现Gemini的流式响应,并管理上下文和自动资源清理。审计强调了结构化并发应用的优势,使该代码成为学习Android异步编程的标杆示例。

Marcin赞扬了其坚实的结构和边缘情况覆盖,并亲自为代码库贡献。Kotlin专家研讨会证书确认了其质量。

异步编程的演进:从GOTO到结构化

Gilmetov和Moskała合著的一篇文章将1950-60年代的意大利面代码(FLOW-MATIC中的逻辑跳转)与非结构化协程相类比。在没有作用域的情况下启动任务会导致泄漏:子协程在父协程取消后继续运行,消耗资源。

Google AdInline article slot

Edsger Dijkstra在1968年的《Go To语句被认为有害》中论证了放弃GOTO以提高可预测性。类似地,结构化并发为并行性引入了清晰的边界。

结构化并发的黄金法则

在Kotlin中,三个关键机制确保对协程的控制:

  • 上下文继承:子协程从父协程接收分发器和其他参数。
  • 完成等待:作用域会阻塞,直到内部所有launch/async任务完成。
  • 自动取消:父协程的取消或错误会导致整个任务树崩溃。

基本构造示例:

Google AdInline article slot
coroutineScope {
    launch { /* 任务1 */ }
    launch { /* 任务2 */ }
}
// 仅在任务完成后继续

在Android中的应用:ViewModel和Repository

在GeminiAI中,ChatRepository封装了与Gemini的API请求,而ViewModel通过viewModelScope管理取消。当ViewModel销毁时,所有网络调用和流式处理自动中断,最小化内存泄漏。

  • viewModelScope:一个结构化的生命周期感知作用域,用于ViewModel。
  • Repository中的Flow:用于状态的响应式流,无需init{}块。
  • Dagger-Hilt + Room:可扩展的依赖注入和持久化。

这涵盖了流式处理中的边缘情况:取消请求会立即清理上下文。

生产环境中的优势

结构化并发简化了调试、测试和维护。没有“被遗忘”的任务,生命周期可预测。与旧方法(GlobalScope)相比:

Google AdInline article slot

| 方法 | 内存泄漏 | 任务取消 | 生命周期 |

|------|----------|----------|----------|

| GlobalScope | 高风险 | 手动 | 无 |

| coroutineScope | 无 | 自动 | 结构化 |

| viewModelScope | 无 | 自动 | 生命周期感知 |

GeminiAI项目展示了与Jetpack Compose的集成:通过Flow进行导航和UI更新,不阻塞UI。

关键要点

  • 结构化并发消除了任务泄漏,类似于放弃GOTO。
  • viewModelScope是Android ViewModel的标准,具有自动取消功能。
  • 上下文继承和完成等待确保了可预测性。
  • 在GeminiAI中的应用:Gemini流式处理与资源清理。
  • Moskała的审计确认该代码是高级开发者的示例。

— Editorial Team

Advertisement 728x90

继续阅读