Kotlin 协程的四种启动模式
Posted 安果移不动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程的四种启动模式相关的知识,希望对你有一定的参考价值。
Default :协程创建后立即开始调度。在调度前如果协程被取消。将其直接进入取消相应的状态。
ATOMIC:协程创建后。立即开始调度。协程执行到第一个挂起点之前不相应取消。
LAZY:只有协程被需要时,包括主动调协程的start、join或者await等函数时,才会开始调度,如果调度前就被取消。那么该协程将直接进入异常状态。
UNDISPATCHED:协程创建后立即在当前函数调用栈中执行,直到遇到第一个真正挂起的点。
CoroutineStart.DEFAULT
代码案例
binding.btClick7.setOnClickListener
runBlocking
val job = launch(start = CoroutineStart.DEFAULT)
delay(10000)
Log.e(TAG, "onCreate: Job finished.")
delay(1000)
job.cancel()
Log.e(TAG, "onCreate: Job cancel.")
协程将不会执行
因为在执行的时候给取消了。
ATOMIC
binding.btClick7.setOnClickListener
runBlocking
val job = launch(start = CoroutineStart.ATOMIC)
//这里代码
//这些任务一定会被执行
//到这里代码
//这里就是一个挂起点
delay(10000)
Log.e(TAG, "onCreate: Job finished.")
delay(1000)
job.cancel()
Log.e(TAG, "onCreate: Job cancel.")
就是到挂起函数之前的代码是不会被取消掉的。到了挂起点之后才可以进行取消
LAZY
runBlocking
val job = async(start = CoroutineStart.LAZY)
29
//执行计算
//启动协程
Log.e(TAG, "Completed job.start in $job.start() ms")
//或者使用await
job.cancel()
job.await()
job.join()
job.cancel() 会进入异常状态。如果不进行await、join、或者是start操作 将不会被启动。
默认情况下
val job = async(context = Dispatchers.IO, start = CoroutineStart.DEFAULT)
Log.e(TAG, "thread:" + Thread.currentThread().name)
会在子线程中执行
如果使用
UNDISPATCHED模式
binding.btClick7.setOnClickListener
runBlocking
val job = async(context = Dispatchers.IO, start = CoroutineStart.UNDISPATCHED)
Log.e(TAG, "thread:" + Thread.currentThread().name)
则会打印出来主线程
底部的打印对应上面默认方式启动
为什么会打印出来主线程呢
协程创建后立即在当前函数调用栈中执行,因为是在主线程中执行。所以会在主线程执行。
UNDISPATCHED就是不转发的意思。
以上是关于Kotlin 协程的四种启动模式的主要内容,如果未能解决你的问题,请参考以下文章