Kotlin 协程分层架构 : 在 Kotlin 中 , 协程分为两层 ;
基础设施层 : 基础设施层 的 协程基础 Api 定义在 kotlin.coroutines.*
包下 ;
import kotlin.coroutines.*
业务框架层 : 如果调用 常见的协程 Api , 调用的是 业务框架层 的 Api , 如 GlobalScope , launch , Dispatchers 等 , 都定义在 kotlinx.coroutines.*
包下 ;
import kotlinx.coroutines.*
可以类比的理解为
协程 需要使用 协程体定义 , 协程体格式如下 :
suspend {
// 协程体内容
}
协程体定义完之后 , 调用协程体的 createCoroutine 函数 , 传入 Continuation 实例对象 , 一般传入一个 对象表达式 ( Java 中的匿名内部类 ) 作为参数 ;
对象表达式 object : Continuation
中 Continuation 后的
协程执行完毕后, 将协程执行结果返回 , 此时会回调 override fun resumeWith(result: Result
函数 ;
// 创建协程
// 注意只是创建协程, 创建后还需要调用 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.*