Suspend修飾符
探討背後的原理
創建Coroutine
簡單創建一個Coroutine
val suspendFunction = suspend {
println("In Coroutine")
5
}.createCoroutine(object : Continuation<Int>{
override val context: CoroutineContext
get() = EmptyCoroutineContext
override fun resumeWith(result: Result<Int>) {
println("Coroutine End: ${result.getOrThrow()}")
}
})
以下為createCoroutine的宣告,這個Coroutine並不會馬上執行。
public fun <T> (suspend () -> T).createCoroutine(
completion: Continuation<T>
): Continuation<Unit>
suspend () -> T是一個Function Type,createCoroutine是suspend () -> T的Extension Function。
參數completion會在執行Coroutine完成後執行,也就是說完成Callback。
回傳值是一個Continuation物件,由於現在只是被創建出來,之後會使用這個回傳值來觸發Coroutine的啟動。
Continuation是一個介面,如果不管Context,作用有點像是使用Callback。
public interface Continuation<in T> {
public val context: CoroutineContext
public fun resumeWith(result: Result<T>)
}
啟動Coroutine
在上面我們已經知道怎麼創建Coroutine了,接下來要怎麼啟動一個Coroutine呢?
回想一下之前提到的概念,Coroutine是一個中斷及繼續執行的函式呼叫,允許函式被暫停(suspended)執行之後再回復(resumed)執行。
目前我們正在suspend的狀態,接下來只要resume就會開始執行。
suspendFunction.resumeWith(Result.success(Unit))