跳转到正文
YGJoon
返回

Android Kotlin 协程基础与调度器

编辑文章

核心概念速览

suspend fun fetchUser(): User {
    return apiService.getUser()
}

GlobalScope.launch {
    val user = fetchUser()
    println(user)
}

实际 Android 开发不推荐使用 GlobalScope,请使用生命周期感知的作用域。

协程作用域

作用域用途
GlobalScope全局生命周期,避免使用
lifecycleScopeLifecycleOwner(Activity/Fragment)
viewModelScopeViewModel 生命周期
CoroutineScope 自定义业务层自定义生命周期
class MainViewModel : ViewModel() {
    fun load() = viewModelScope.launch {
        val data = repository.fetch()
        _uiState.value = data
    }
}

调度器与线程切换

调度器描述场景
Dispatchers.Main主线程,UI 更新更新 UI、Compose 状态
Dispatchers.IOIO 密集任务网络请求、磁盘操作
Dispatchers.DefaultCPU 密集任务解析 JSON、加密运算
Dispatchers.Unconfined不限制线程,谨慎使用调试、测试
lifecycleScope.launch(Dispatchers.IO) {
    val result = api.getArticles()
    withContext(Dispatchers.Main) {
        render(result)
    }
}

协程构建器

val user = async { repository.fetchUser() }
val posts = async { repository.fetchPosts() }
val homeData = awaitAll(user, posts)

异常处理

val handler = CoroutineExceptionHandler { _, throwable ->
    Timber.e(throwable, "coroutine error")
}

viewModelScope.launch(handler) {
    try {
        repository.fetch()
    } catch (e: IOException) {
        _uiState.value = UiState.Error(e)
    }
}

结构化并发

suspend fun refreshData() = coroutineScope {
    val userDeferred = async { repository.fetchUser() }
    val feedDeferred = async { repository.fetchFeed() }
    val user = userDeferred.await()
    val feed = feedDeferred.await()
    user to feed
}

协程与传统回调的对比

特点回调方式协程方式
可读性回调地狱线性代码
错误处理需逐层捕获结构化并发统一处理
资源释放容易泄漏作用域取消自动释放

常见误区

总结

  1. 协程提供轻量级并发机制,通过作用域与调度器管理生命周期和线程。
  2. 结构化并发有助于统一错误处理并避免资源泄漏。
  3. 掌握 launch、async、withContext 等常用构建器,是进阶 Flow 与 Compose 的基础。

下一篇将把协程应用到 Android 实战,涵盖网络请求、Room 与 UI 协同。


编辑文章
分享这篇文章:

上一篇
Android Kotlin 协程测试与调试技巧
下一篇
Android Kotlin 协程在实际项目中的应用