Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • GlobalScope 与 runBlocking

GlobalScope 与 runBlocking

GlobalScope:全局协程作用域

GlobalScope 是 Kotlin 协程库中预定义的全局协程作用域,其生命周期与整个应用程序一致。使用 GlobalScope 启动的协程具有以下特点:

  1. 生命周期独立:协程不会绑定到任何特定的组件(如 Activity 或 Fragment),即使组件销毁,协程仍会继续执行。
  2. 谨慎使用:容易造成内存泄漏或资源浪费,通常仅用于顶级长时间运行的任务(如日志上报、心跳检测等)。

基本用法

GlobalScope.launch {
    // 在后台线程执行耗时操作
    delay(1000L)
    println("GlobalScope 协程执行完毕")
}

runBlocking:阻塞式协程构建器

runBlocking 是一个特殊的协程构建器,它会阻塞当前线程直到其内部所有协程执行完毕。主要用途包括:

  1. 测试环境:在单元测试中保证协程完成。
  2. 主函数:在 main() 中启动协程程序。
  3. 桥接阻塞与非阻塞代码:临时将非阻塞协程代码嵌入传统阻塞调用链。

基本用法

fun main() = runBlocking {
    // 主线程会在此阻塞
    launch {
        delay(1000L)
        println("runBlocking 内部协程")
    }
    println("主线程继续执行")
}
// 输出顺序:
// 主线程继续执行
// runBlocking 内部协程

对比与最佳实践

特性GlobalScoperunBlocking
线程行为非阻塞(默认调度器为 Dispatchers.Default)阻塞当前线程
生命周期全局作用域,需手动取消随代码块结束自动取消
典型场景应用级后台任务测试、main() 函数或临时阻塞调用

最佳实践建议

  1. 避免滥用 GlobalScope:优先使用自定义的 CoroutineScope(如 viewModelScope 或 lifecycleScope)。
  2. 替代方案:在 Android 中,使用 lifecycleScope 或 viewModelScope 替代 GlobalScope。
  3. runBlocking 限制:禁止在 UI 线程或协程内部使用 runBlocking,否则可能导致死锁。

示例:合理使用自定义作用域

// 自定义作用域示例
class MyComponent {
    private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
    
    fun doWork() {
        scope.launch {
            // 安全的协程操作
        }
    }
    
    fun destroy() {
        scope.cancel() // 避免内存泄漏
    }
}

⚠️ 注意:在 Android 中,直接使用 GlobalScope.launch 可能导致 Activity 销毁后协程继续持有 View 引用,引发内存泄漏。

Last Updated:: 5/21/25, 7:58 PM