深色模式
协程作用域
协程构建器
有哪些协程构建器?
以下5个函数,都定义在kotlinx.coroutines.Builders.kt
中
CoroutineScope.launch()
Launches a new coroutine without blocking the current thread and returns a reference to the coroutine as a Job. The coroutine is cancelled when the resulting job is cancelled.
启动一个新的协程,不阻塞当前线程,并且返回这个协程的引用,这个引用用一个Job
对象表示。当这个Job
调用cancel()
时,此协程会取消。
仔细看此函数的签名,它是一个扩展函数,有3个参数:
context
start
block
kotlin
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
CoroutineScope.async()
Creates a coroutine and returns its future result as an implementation of Deferred. The running coroutine is cancelled when the resulting deferred is cancelled. The resulting coroutine has a key difference compared with similar primitives in other languages and frameworks: it cancels the parent job (or outer scope) on failure to enforce structured concurrency paradigm. To change that behaviour, supervising parent (SupervisorJob or supervisorScope) can be used.
kotlin
public fun <T> CoroutineScope.async(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred<T>
runBlocking()
Runs a new coroutine and blocks the current thread interruptibly until its completion. This function should not be used from a coroutine. It is designed to bridge regular blocking code to libraries that are written in suspending style, to be used in main functions and in tests.
运行一个新的协程,阻塞当前线程,直到协程完成。这个函数的作用是,在测试时,用于main()
函数中。
kotlin
fun main() = runBlocking {
}
withContext()
kotlin
val result = withContext(Dispatchers.Default){
delay(1000)
1 + 1
}
// result is 2
相当于
kotlin
val result = async {
delay(1000)
1 + 1
}.await()
CoroutineDispatcher.invoke()
是withContext()
的另一种写法
kotlin
Dispatchers.Default {
}
相当于
kotlin
withContext(Dispatchers.Default){
}
协程作用域 CoroutineScope
协作式取消,父协程会等待子协程completed,才会completed。
CoroutineScope
有launch
和async
方法,用来创建协程。
各种不同CoroutineScope的区别:
GlobalScope
:全局范围,不会自动结束执行。MainScope()
:主线程的作用域,全局范围。lifecycleScope
:生命周期范围,用于Activity等有生命周期的组件,在DESTROYED的时候会自动结束。viewModelScope
:viewModel范围,用于ViewModel中,在ViewModel被回收时会自动结束。
coroutineScope
supervisorScope
协程启动模式 CoroutineStart
DEFAULT
:默认启动模式,我们可以称之为饿汉启动模式,因为协程创建后立即开始调度,虽然是立即调度,单不是立即执行,有可能在执行前被取消。LAZY
:懒汉启动模式,启动后并不会有任何调度行为,直到我们需要它执行的时候才会产生调度。也就是说只有我们主动的调用Job
的start()
、join()
或者await()
等函数时才会开始调度。ATOMIC
:一样也是在协程创建后立即开始调度,但是它和DEFAULT
模式有一点不一样,通过ATOMIC
模式启动的协程执行到第一个挂起点之前是不响应cancel
取消操作的,ATOMIC
一定要涉及到协程挂起后cancel
取消操作的时候才有意义。UNDISPATCHED
:协程在这种模式下会直接开始在当前线程下执行,直到运行到第一个挂起点。这听起来有点像ATOMIC
,不同之处在于UNDISPATCHED
是不经过任何调度器就开始执行的。当然遇到挂起点之后的执行,将取决于挂起点本身的逻辑和协程上下文中的调度器。
协程句柄 Job
Job
是协程的句柄。使用 launch
或 async
创建的每个协程都会返回一个 Job
实例,该实例是相应协程的唯一标识并管理其生命周期。
Job
可以:
查询协程的状态:
isActive
:isCompleted
isCancelled
生命周期相关操作:
cancel()
:用于Job的取消,取消协程start()
:用于启动一个协程,在该协程是CoroutineStart.LAZY
的情况下invokeOnCompletion()
:添加一个监听,当工作完成或者异常时会调用join()
:阻塞并等候当前协程完成