suspend修饰符,它可以告诉编译器,该函数需要在协程中执行。作为开发者,您可以把挂起函数看作是普通函数,只不过它可能会在某些时刻挂起和恢复而已。协程的挂起就是退出方法,等到一定条件到来会重新执行这个方法,因为对方有这个协程的引用,当然可以调用你的方法了。
普通函数不可以调用挂起函数。因为挂起函数有有一个隐形的参数Continuation,普通方法没有办法传Continuation参数,Continuation可以简单理解成java中的Callback。
suspend修饰的方法不一定真的可以挂起,只要这个方法接收到COROUTINE_SUSPENDED结果,就表示可以挂起了,即退出方法。
private fun logX(any: Any?) {
println("[Time:${
LocalTime.now()} Thread:${
Thread.currentThread().name}] $any ".trimIndent())
}
// 一个普通方法
private fun doFun1() {
println("doFun1")
}
// 一个suspend修饰的方法,但是方法内没有挂起点,方法体可普通方法一样,但是多一个Continuation参数
private suspend fun doSuspendFun1(p1: Int) {
println("doSuspendFun1")
}
// 方法中用了delay方法,delay方法返回了COROUTINE_SUSPENDED
// 表示doSuspendFun2方法在执行完delay方法后就会退出
private suspend fun doSuspendFun2(p1: Int, p2: Int) {
delay(1000)
println("doSuspendFun2")
}
fun main() {
GlobalScope.launch {
println("launch")
doSuspendFun2(1, 1)
}
val block = suspend {
println("SuspendLambda")
"block"
}
val completion = object : Continuation<String> {


7635

被折叠的 条评论
为什么被折叠?



