【Kotlin 协程】协程底层实现 ① ( Kotlin 协程分层架构 | 基础设施层 | 业务框架层 | 使用 Kotlin 协程基础设施层标准库 Api 实现协程 )

2023-03-30 18:05:13 浏览数 (1)

文章目录

  • 一、Kotlin 协程分层架构
  • 二、使用 Kotlin 协程基础设施层标准库 Api 实现协程

一、Kotlin 协程分层架构


Kotlin 协程分层架构 : 在 Kotlin 中 , 协程分为两层 ;

  • 基础设施层 : Kotlin 提供了 协程 标准库 Api , 为协程提供 概念 , 语义 支持 , 是 协程 实现的基础 ; Kotlin 协程的底层支持 ; 基础 Api ;
  • 业务框架层 : Kotlin 协程的 上层框架 , 使用方便 ; 在之前博客中使用的 GlobalScope 类 , launch 函数 , delay 挂起函数 等都属于 业务框架层 , 都是 Kotlin 协程 的上层实现 ; 在 基础 Api 的基础上 进行了一层封装 , 形成了方便开发者使用的框架 ;

基础设施层 : 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.* 包下 ;

代码语言:javascript复制
import kotlin.coroutines.*

业务框架层 : 如果调用 常见的协程 Api , 调用的是 业务框架层 的 Api , 如 GlobalScope , launch , Dispatchers 等 , 都定义在 kotlinx.coroutines.* 包下 ;

代码语言:javascript复制
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>) 函数 ;

代码语言:javascript复制
// 创建协程
// 注意只是创建协程, 创建后还需要调用 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 方法 ;

代码语言:javascript复制
// 启动协程
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.* 包下 ;

代码语言:javascript复制
import kotlin.coroutines.*

业务框架层 : 如果调用 常见的协程 Api , 调用的是 业务框架层 的 Api , 如 GlobalScope , launch , Dispatchers 等 , 都定义在 kotlinx.coroutines.* 包下 ;

代码语言:javascript复制
import kotlinx.coroutines.*

0 人点赞