1. CoroutineScope
可以理解為協程本身,包含了CoroutineContext。
2. CoroutineContext
CoroutineContext叫做協程上下文,是一些元素的集合,主要包括Job和CoroutineDispatcher元素,可以代表-協程的場景。
3. EmptyCoroutineContext
表示一個空的協程上下文。
4. CoroutineDispatcher
CoroutineDispatcher是協程調度器,決定協程所在的線程或線程池。它可以指定協程運行於特定的一個線程、一個線程池或者不指定任何線程(這樣協程就會運行於當前線程)。
在coroutines-core中CoroutineDispatcher有三種標准實現:Dispatchers.Default、Dispatchers.lO,Dispatchers.Main和Dispatchers.Unconfined(Unconfined就是不指定線程)
launch函數定義如果不指定CoroutineDispatcher或者沒有其他的Continuationlnterceptor,默認的協程調度器就是Dispatchers.Default,Default是一個協程調度器,其指定的線程為共有的線程池,線程數量至少為2,最大與CPU數相同。
5. Job & Deferred
5.1 Job
Job,任務,封裝了協程中需要執行的代碼邏輯。Job可以取消並且有簡單的生命周期,它有三種狀態:
Job完成時是沒有返回值的,如果需要返回值的話,應該使用Deferred,它是Job的子類
5.2 Deferred
Deferred有返回值,其他同Job。
6. Coroutine builders
CoroutineScope.launch函數屬於協程構建器Coroutine builders,Kotlin中還有其他幾種Builders,負責創建協程。
-
CoroutineScope.launch{}是最常用的Coroutine builders,不阻塞當前線程,在后台創建一個新協程,也可以指定協程調度器。
-
runBlocking{}是創建一個新的協程同時阻塞當前線程,直到協程結束。這個不應該在協程中使用,主要是為main函數和測試設計的。
-
withContext{}不會創建新的協程,在指定協程上運行掛起代碼塊,並掛起該協程直至代碼塊運行完成。
-
async{},CoroutineScope.async可以實現與launch builder一樣的效果,在后台創建一個新協程,唯一的區別是它有返回值,因為CoroutineScope.async{}返回的是Deferred類型。