Kotlin协程重要概念介绍
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类型。