Android Kotlin 协程入门与基础用法详解
前言
本文面向具有一定 Kotlin 基础和 Android 开发基础的读者。文章将从零开始讲解 Kotlin 协程的基本使用、项目应用及部分原理知识,涵盖 Kotlin 基础知识、组件及常用第三方框架的基础使用。
项目配置
创建以 Kotlin 为开发语言的工程项目 KotlinCoroutineDemo,在 project/build.gradle 中引用:
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.32"
在 app/build.gradle 中引用相关依赖:
// Kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.4.32"
// 协程核心库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3"
// 协程 Android 支持库
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.3"
主要版本号:
- Android Studio: 4.1.3
- Kotlin: 1.4.32
- kotlinx-coroutines-android: 1.4.3
- Retrofit: 2.9.0
- OkHttp: 4.9.0
- Coil: 1.2.0
- Room: 2.2.5
Kotlin 协程基础介绍
为了方便表述,下文将 Kotlin 协程简称为协程(Coroutine)。
什么是协程
协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程上调度执行,而代码则保持如同顺序执行一样简单。
简单的概括就是我们可以以同步的方式去编写异步执行的代码。协程是依赖于线程的,但是协程挂起时不需要阻塞线程,几乎是无代价的。所以协程像是一种用户态的线程,非常轻量级,一个线程中可以创建 N 个协程。
协程的创建通过 CoroutineScope,启动方式有三种:
runBlocking<T>:启动一个新的协程并阻塞调用它的线程,直到里面的代码执行完毕,返回值是泛型T。launch<Job>:启动一个协程但不会阻塞调用线程,必须要在协程作用域(CoroutineScope)中才能调用,返回值是一个 Job。async<Deferred<T>>:启动一个协程但不会阻塞调用线程,必须要在协程作用域(CoroutineScope)中才能调用。以Deferred对象的形式返回协程任务。
Job、Deferred 与协程作用域
Job
Job 可以认为就是一个协程作业,是通过 CoroutineScope.launch 生成的。它运行一个指定的代码块,并在该代码块完成时完成。我们可以通过 isActive、isCompleted、isCancelled 来获取到 Job 的当前状态。


