}
-
方法一通常适用于单元测试的场景,而业务开发中不会用到这种方法,因为它是线程阻塞的。
-
方法二和使用 runBlocking 的区别在于不会阻塞线程。但在 Android 开发中同样不推荐这种用法,因为它的生命周期会和 app 一致,且不能取消(什么是协程的取消后面会讲)。
-
方法三是比较推荐的使用方法,我们可以通过 context 参数去管理和控制协程的生命周期(这里的 context 和 Android 里的不是一个东西,是一个更通用的概念,会有一个 Android 平台的封装来配合使用)。
协程最常用的功能是并发,而并发的典型场景就是多线程。可以使用 Dispatchers.IO
参数把任务切到 IO 线程执行:
CoroutineScope(Dispatchers.IO).launch {
…
}
也可以使用 Dispatchers.Main
参数切换到主线程:
CoroutineScope(Dispatchers.Main).launch{
…
}
所以在「协程是什么」一节中讲到的异步请求的例子完整写出来是这样的:
CoroutineScope(Dispatchers.Main).launch{ // 在主线程开启协程
val user = api.getUser() // IO 线程执行网络请求
nameTv.text = user.name // 主线程更新 UI
}
而通过 Java 实现以上逻辑,我们通常需要这样写:
api.getUser(new Callback() {
@Override
public void success(User user) {
runOnUiThread(new Runnable() {
@Override
public void run() {
nameTv.setText(user.name);
}
})
}
@Override
public void failure(Exception e) {
…
}
});
这种回调式的写法,打破了代码的顺序结构和完整性,读起来相当难受。
3.协程具体怎么用
a.添加依赖
//依赖协程核心库
implementation ‘org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.5’
//依赖当前平台所对应的平台库
implementation ‘org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.5’
Kotlin 协程是以官方扩展库的形式进行支持的。我们所使用的「核心库」和 「平台库」的版本应该保持一致。
-
核心库中包含的代码主要是协程的公共 API 部分。有了这一层公共代码,才使得协程在各个平台上的接口得到统一。
-
平台库中包含的代码主要是协程框架在具体平台的具体实现方式。因为多线程在各个平台的实现方式是有所差异- 的。
b.开始使用
协程最简单的使用方法,其实在前面章节就已经看到了。我们可以通过一个 launch
函数实现线程切换的功能:
CoroutineScope(Dispatch