文章目录
- 一、Kotlin 协程分层架构
- 二、使用 Kotlin 协程基础设施层标准库 Api 实现协程
一、Kotlin 协程分层架构
Kotlin 协程分层架构 : 在 Kotlin 中 , 协程分为两层 ;
- 基础设施层 : Kotlin 提供了 协程 标准库 Api , 为协程提供 概念 , 语义 支持 , 是 协程 实现的基础 ; Kotlin 协程的底层支持 ; 基础 Api ;
- 业务框架层 : Kotlin 协程的 上层框架 , 使用方便 ; 在之前博客中使用的 GlobalScope 类 , launch 函数 , delay 挂起函数 等都属于 业务框架层 , 都是 Kotlin 协程 的上层实现 ; 在 基础 Api 的基础上 进行了一层封装 , 形成了方便开发者使用的框架 ;
基础设施层 : 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.*
包下 ;
import kotlin.coroutines.*
业务框架层 : 如果调用 常见的协程 Api , 调用的是 业务框架层 的 Api , 如 GlobalScope , launch , Dispatchers 等 , 都定义在 kotlinx.coroutines.*
包下 ;
import kotlinx.coroutines.*
可以类比的理解为
- 基础设施层 是 Android 和 Java 的基础 Api ,
- 业务框架层 是 对 基础 Api 进行了一层封装的框架 , 如 RxJava , Retrofit , Glide 等 , 目的是为了方便开发 ;
二、使用 Kotlin 协程基础设施层标准库 Api 实现协程
协程 需要使用 协程体定义 , 协程体格式如下 :
代码语言:javascript复制suspend {
// 协程体内容
}
协程体定义完之后 , 调用协程体的 createCoroutine 函数 , 传入 Continuation 实例对象 , 一般传入一个 对象表达式 ( Java 中的匿名内部类 ) 作为参数 ;
对象表达式 object : Continuation<Int>
中 Continuation 后的 <Int> 泛型 表示的是协程体的返回值类型 ;
协程执行完毕后, 将协程执行结果返回 , 此时会回调 override fun resumeWith(result: Result<Int>)
函数 ;
// 创建协程
// 注意只是创建协程, 创建后还需要调用 resume 启动协程
val continuation = suspend { //协程体
// 协程体返回值为 int 值 0
0
}.createCoroutine(object : Continuation<Int>{
// Continuation 后的 Int 泛型表示 协程体返回值为 Int 类型
// 协程上下文设置为 空的协程上下文 EmptyCoroutineContext
override val context: CoroutineContext = EmptyCoroutineContext
// 协程执行完毕后, 将协程执行结果返回
// 该函数是一个回调函数
override fun resumeWith(result: Result<Int>) {
Log.i("MainActivity", "协程体返回值为 $result")
}
})
上面只是创建协程 , 如果要执行协程 , 还需要调用协程的 resume
方法 ;
// 启动协程
continuation.resume(Unit)
完整代码如下 :
代码语言:javascript复制package kim.hsl.coroutine
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import kotlin.coroutines.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 创建协程
// 注意只是创建协程, 创建后还需要调用 resume 启动协程
val continuation = suspend { //协程体
// 协程体返回值为 int 值 0
0
}.createCoroutine(object : Continuation<Int>{
// Continuation 后的 Int 泛型表示 协程体返回值为 Int 类型
// 协程上下文设置为 空的协程上下文 EmptyCoroutineContext
override val context: CoroutineContext = EmptyCoroutineContext
// 协程执行完毕后, 将协程执行结果返回
// 该函数是一个回调函数
override fun resumeWith(result: Result<Int>) {
Log.i("MainActivity", "协程体返回值为 $result")
}
})
// 启动协程
continuation.resume(Unit)
}
}
基础设施层 : 上述 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.*
包下 ;
import kotlin.coroutines.*
业务框架层 : 如果调用 常见的协程 Api , 调用的是 业务框架层 的 Api , 如 GlobalScope , launch , Dispatchers 等 , 都定义在 kotlinx.coroutines.*
包下 ;
import kotlinx.coroutines.*