Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )相关的知识,希望对你有一定的参考价值。

文章目录





一、协程的挂起和恢复概念



函数 最基本的操作 是 :

  • 调用 call : 通过 函数名或函数地址 调用函数 ;
  • 返回 return : 函数执行完毕后 , 继续执行函数调用的下一行代码 ;

协程调用 call返回 return 基础上 , 又新增了两种 状态 :

  • 挂起 Suspend : 暂停当前执行的协程 , 保存挂起点的局部变量 , 然后执行异步任务 , 后面的代码会得到异步任务执行完毕 , 恢复 Resume 挂起状态后再执行后续代码 ;
  • 恢复 Resume : 暂停的协程 继续执行 ;

如果 没有挂起操作 , 在子线程中执行异步任务后 , 会马上执行后续的代码 , 只是相当于 普通的多线程操作 ;

协程的作用就是 可以 顺序地执行 异步任务 和 主线程任务 , 其执行顺序按照代码顺序执行 ;


挂起 函数 , 只能在 协程体内部 或者 其它挂起函数 中调用 ;

协程外部不允许使用挂起函数 ;

在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后 恢复 Resume ;





二、协程的 suspend 挂起函数



声明挂起函数 , 使用 suspendfun 关键字之前 修饰函数 , 如 :

public suspend fun Test() 
	// 函数体

如果在 函数 A 中调用上述 Test 挂起函数 , 则 函数 A 也必须是 挂起函数 ;

在协程中 , GlobalScope.launch(Dispatcher.Main) 中 , 可以直接调用挂起函数 ;


挂起 函数 , 只能在 协程体内部 或者 其它挂起函数 中调用 ;

协程外部不允许使用挂起函数 ;

在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后 恢复 Resume ;


在如下代码中 , asynTask 是可挂起的异步任务 函数 , 在 Test 函数中调用 asynTask 函数 , Test 函数必须也是 挂起函数 , 需要由 suspend 修饰 ;

public suspend fun Test() 
	asynTask()
	updateMain()


public suspend fun asynTask() 
	// 子线程中执行异步任务


public fun updateMain() 
	// 主线程更新 UI


分析上述 挂起 suspend 函数 Test() 的 调用流程 :

执行 suspend fun Test() 函数时 , 该函数会放入 应用主线程 的 栈帧 中 ,

( 此时栈帧内容 : Test 函数 , 左侧是栈底 )


继续执行内部的 suspend fun asynTask() 函数时 , 该函数也是挂起函数 , 先进行 挂起 suspend 操作 ,

( 此时栈帧内容 : Test 函数 | asynTask 函数 , 左侧是栈底 )


然后执行异步任务 , 异步任务执行完毕后 , 恢复 resume suspend fun asynTask() 函数 , 该函数又回到了 主线程 栈帧 中 , 执行完毕后 , 该函数从 栈帧 中移除 ;

( 此时栈帧内容 : Test 函数 , 左侧是栈底 )


栈帧中恢复 suspend fun Test() 函数中 , 继续执行函数的后半部分 updateMain() , 执行主线程更新 UI 内容 ;

( 此时栈帧内容 : Test 函数 | updateMain 函数 , 左侧是栈底 )

以上是关于Kotlin 协程协程的挂起和恢复 ① ( 协程的挂起和恢复概念 | 协程的 suspend 挂起函数 )的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )

Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )

一文搞明白协程的挂起和恢复

一文搞明白协程的挂起和恢复

一文搞明白协程的挂起和恢复

Kotlin 协程Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )