Kotlin協程
| 作用域構建器 | 說明 | 調用 |
|---|---|---|
| GlobalScope.launch函數 | 每次創建的都是一個頂層協程,這種協程當應用程序運行結束時也會跟著一起結束。 不建議使用。 |
可以在任意地方調用。 |
| runBlocking函數 | 同樣會創建一個協程的作用域,但是它可以保證在協程作用域內的所有代碼和子協程沒有全部執行完之前一直阻塞當前線程。 通常只應該在測試環境下使用。 |
可以在任意地方調用。 |
| launch函數 | 和我們剛才所使用的GlobalScope.launch函數不同。首先它必須在協程的作用域中才能調用,其次它會在當前協程的作用域下創建子協程。子協程的特點是如果外層作用域的協程結束了,該作用域下的所有子協程也會一同結束。 返回值是一個Job對象。 |
只能在協程作用域中調用。 |
| coroutineScope函數 | 也是一個掛起函數,因此可以在任何其他掛起函數中調用。它的特點是會繼承外部的協程的作用域并創建一個子協程,借助這個特性,我們就可以給任意掛起函數提供協程作用域了。它可以保證其作用域內的所有代碼和子協程在全部執行完之前,會一直阻塞當前協程。 | 可以在協程作用域或掛起函數中調用。 |
| CoroutineScope()函數 | 會返回一個CoroutineScope對象,可以隨時調用CoroutineScope對象的launch函數來創建一個新協程了。 所有調用CoroutineScope的launch函數所創建的協程,都會被關聯在Job對象的作用域下面。這樣只需要調用一次cancel()方法,就可以將同一作用域內的所有協程全部取消。 |
|
| async函數 | 會創建一個新的子協程并返回一個Deferred對象,如果我們想要獲取async函數代碼塊的執行結果,只需要調用Deferred對象的await()方法。 在調用了async函數之后,代碼塊中的代碼就會立刻開始執行。當調用await()方法時,如果代碼塊中的代碼還沒執行完,那么await()方法會將當前協程阻塞住,直到可以獲得async函數的執行結果。 |
只能在協程作用域調用。 |
| withContext()函數 | 是一個掛起函數,大體可以將它理解成async函數的一種簡化版寫法。 調用withContext()函數之后,會立即執行代碼塊中的代碼,同時將外部協程掛起。 withContext()函數強制要求我們指定一個線程參數(線程參數會給協程指定一個具體的運行線程)。線程參數主要有以下3種值可選:Dispatchers.Default(默認低并發)、Dispatchers.IO(較高并發)和Dispatchers.Main(不會開啟子線程,而是在Android主線程中執行代碼,但是這個值只能在Android項目中使用,純Kotlin程序使用這種類型的線程參數會出現錯誤)。 |
只能在協程作用域調用。 |
suspend關鍵字:使用它可以將任意函數聲明成掛起函數,而掛起函數之間都是可以互相調用的。
浙公網安備 33010602011771號