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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程协程底层实现 ① ( 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 实现协程



协程 需要使用 协程体定义 , 协程体格式如下 :

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)

完整代码如下 :

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.*

以上是关于Kotlin 协程协程底层实现 ① ( Kotlin 协程分层架构 | 基础设施层 | 业务框架层 | 使用 Kotlin 协程基础设施层标准库 Api 实现协程 )的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程底层实现 ④ ( 结构化并发 | viewModelScope 作用域示例 )

Kotlin 协程协程底层实现 ④ ( 结构化并发 | viewModelScope 作用域示例 )

Kotlin 协程协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

Kotlin 协程协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

Kotlin 协程协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )

Kotlin 协程协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )