关键词:
启动协程的基本方式
1.GlobalScope.launch
代码示例:
fun testGlobalScope()
GlobalScope.launch
println("Coroutinue started!")
delay(1000L)
println("Hello World!")
println("After launch!")
Thread.sleep(2000L)
println("Process end!")
/**
* After launch!
* Coroutinue started!
* Hello World!
* Process end!
*/
@DelicateCoroutinesApi
public object GlobalScope : CoroutineScope
/**
* Returns [EmptyCoroutineContext].
*/
override val coroutineContext: CoroutineContext
get() = EmptyCoroutineContext
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
val newContext = newCoroutineContext(context)
val coroutine = if (start.isLazy)
LazyStandaloneCoroutine(newContext, block) else
StandaloneCoroutine(newContext, active = true)
coroutine.start(start, coroutine, block)
return coroutine
launch函数是CoroutineScope的扩展函数,它有三个参数:
- context: CoroutineContext = EmptyCoroutineContext, 第一个参数是协程上下文,它的默认值是 EmptyCoroutineContext,如果不传这个参数,默认就会使用 EmptyCoroutineContext。也可以传入 Kotlin 官方为我们提供的 Dispatchers,来指定协程运行的线程池。(Dispatchers.IO、Dispatchers.Unconfined、Dispatchers.Main)
- start: CoroutineStart = CoroutineStart.DEFAULT,第二个参数是协程的启动模式,默认值是CoroutineStart.DEFAULT,CoroutineStart 是一个枚举类,一共有:DEFAULT、LAZY、ATOMIC、UNDISPATCHED。
- block: suspend CoroutineScope.() -> Unit,第三个参数是函数类型block,它的类型是suspend CoroutineScope.() -> Unit。本质是一个挂起函数。
- 函数的返回值是一个 Job,它其实代表的是协程的句柄,并不能返回协程的执行结果。
2.runBlocking 启动协程
代码示例
fun testRunBlocking2()
runBlocking
println("Coroutinue started!")
delay(1000L)
println("Hello World!")
println("After Launch")
Thread.sleep(2000L)
println("Process end")
/**
* Coroutinue started!
* Hello World!
* After Launch
* Process end
*/
@Throws(InterruptedException::class)
public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T
contract
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
val currentThread = Thread.currentThread()
val contextInterceptor = context[ContinuationInterceptor]
val eventLoop: EventLoop?
val newContext: CoroutineContext
if (contextInterceptor == null)
// create or use private event loop if no dispatcher is specified
eventLoop = ThreadLocalEventLoop.eventLoop
newContext = GlobalScope.newCoroutineContext(context + eventLoop)
else
// See if context's interceptor is an event loop that we shall use (to support TestContext)
// or take an existing thread-local event loop if present to avoid blocking it (but don't create one)
eventLoop = (contextInterceptor as? EventLoop)?.takeIf it.shouldBeProcessedFromContext()
?: ThreadLocalEventLoop.currentOrNull()
newContext = GlobalScope.newCoroutineContext(context)
val coroutine = BlockingCoroutine<T>(newContext, currentThread, eventLoop)
coroutine.start(CoroutineStart.DEFAULT, coroutine, block)
return coroutine.joinBlocking()
runBlocking是普通函数,第一个参数:context: CoroutineContext,协程上下文。第二个参数是函数类型,block: suspend CoroutineScope.() -> T,函数类型是有返回值类型 T 的,与 runBlocking 的返回值类型是一样的,runBlocking 其实是可以从协程当中返回执行结果的。
fun testRunBlocking()
val runBlockingResult = runBlocking
delay(500L)
return@runBlocking "HaHa"
println("result:$runBlockingResult")
result:HaHa
runBlocking特点:
- runBlocking 启动的协程会阻塞当前线程的执行。
3.async 启动协程
使用 async 创建协程,可以通过它返回的Deferred拿到协程的执行结果。
代码示例
fun testAsync()
runBlocking
val deferred = async
println("do async:$Thread.currentThread().name")
delay(1000L)
return@async "do completed"
println("After async:$Thread.currentThread().name")
val result = deferred.await()
println("Result is: $result")
After async:main @coroutine#1
do async:main @coroutine#2
Result is: do completed
public fun <T> CoroutineScope.async(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> T
): Deferred<T>
val newContext = newCoroutineContext(context)
val coroutine = if (start.isLazy)
LazyDeferredCoroutine(newContext, block) else
DeferredCoroutine<T>(newContext, active = true)
coroutine.start(start, coroutine, block)
return coroutine
async注意点
- async 启动协程以后,不会阻塞当前程序的执行流程。
- async的返回值,是一个 Deferred 对象,它的 await() 方法,就可以拿到协程的执行结果。
- await只是等待执行完,并不是触发执行。
kotlin协程(代码片段)
一、CoroutineScope协程作用域,通过socpe启动一个或者多个协程,同一个socpe启动都算他的子协程GlobalScope//全局协程,生命周期与app相同MainScope()//在主线程启动协程viewmodelScope//生命周期与viewmodel绑定的协程privatevalmainScop... 查看详情
kotlin协程万字协程一篇完成kotlin协程进阶(代码片段)
kotlin协程进阶协程简介一、协程的基本使用1.1、runBlocking启动1.2、GlobalScope.launch启动1.3、GlobalScope.async启动1.4、三种启动方式的说明二、Coroutine源码解析2.1、CoroutineContext2.2、Job源码2.3、Job的常用函数2.4、SupervisorJob三、suspend关键... 查看详情
kotlin协程-launch原理笔记(代码片段)
一、协程是如何创建的?launch、async可以创建、启动新的协程,那么协程到底是如何创建的?runBlockingprintln(Thread.currentThread().name)launchprintln(Thread.currentThread().name)delay(100L)Thread.sleep(1000L)Logmain@coroutine#1main@coroutine#2Processfinished... 查看详情
kotlin协程源码分析-协程的启动(代码片段)
1.简单启动协程Demo本文例子代码地址:gitee.com/mcaotuman/k…写个小demo,先记住怎么用,后面再分析源码。三个挂起函数:输出结果:2.构建suspend修饰的lambda函数2.1suspendlambda下面这段代码是suspend修饰lambda表达式:v... 查看详情
深入理解kotlin协程协程的创建启动挂起函数理论篇(代码片段)
kotlin实现恢复挂起点是通过一个接口类Continuation(英文翻译过来叫"继续、延续、续体")来实现的。Kotlin续体有两个接口: Continuation 和 CancellableContinuation,顾名思义 CancellableContinuation 是一个可以取消的 Continuation... 查看详情
kotlin启动协程launch与async的区别按照顺序启动协程(代码片段)
launch与async的区别binding.btClick5.setOnClickListener//主线程执行协程runBlocking//launch不会会返回执行结果valjob1=launchdelay(200)Log.e(TAG,"onCreate:jbo1finished.")//async会返回执行结果valjob2=asyncdelay(200) 查看详情
kotlin协程的四种启动模式(代码片段)
Default:协程创建后立即开始调度。在调度前如果协程被取消。将其直接进入取消相应的状态。ATOMIC:协程创建后。立即开始调度。协程执行到第一个挂起点之前不相应取消。LAZY:只有协程被需要时,包括主动调协程的... 查看详情
kotlin协程协程启动⑤(协程作用域构建器|runblocking函数|coroutinescope函数|supervisorscope函数)(代码片段)
文章目录一、结构化并发二、协程作用域构建器(runBlocking函数|coroutineScope函数)二、协程作用域构建器(coroutineScope函数|supervisorScope函数)1、协程作用域构建器概念2、coroutineScope协程作用域构建器示例3、supervisorScope协程作用域构建... 查看详情
kotlin协程协程启动⑤(协程作用域构建器|runblocking函数|coroutinescope函数|supervisorscope函数)(代码片段)
文章目录一、结构化并发二、协程作用域构建器(runBlocking函数|coroutineScope函数)二、协程作用域构建器(coroutineScope函数|supervisorScope函数)1、协程作用域构建器概念2、coroutineScope协程作用域构建器示例3、supervisorScope协程作用域构建... 查看详情
kotlin协程协程启动④(协程启动模式|协程构建器启动模式参数|default模式|atomic模式|lazy模式|undispatched模式)(代码片段)
...分析2、协程构建器CoroutineScope.async函数参数原型二、协程启动模式1、DEFAULT模式2、ATOMIC模式3、LAZY模式4、UNDISPATCHED模式5、CoroutineStart中定义的协程启动模式原型一、协程构建器CoroutineScop 查看详情
kotlin协程协程启动④(协程启动模式|协程构建器启动模式参数|default模式|atomic模式|lazy模式|undispatched模式)(代码片段)
...分析2、协程构建器CoroutineScope.async函数参数原型二、协程启动模式1、DEFAULT模式2、ATOMIC模式3、LAZY模式4、UNDISPATCHED模式5、CoroutineStart中定义的协程启动模式原型一、协程构建器CoroutineScop 查看详情
kotlin协程硬核解读(4.协程的创建和启动流程分析)(代码片段)
...函数1.5kotlin的函数类型Function1.6调用操作符()重载2.协程的启动、执行流程分析2.1CoroutineScope.launch()创建协程对象2.2initParentJob()父子Job绑定,传递取消2.3CoroutineStart启动模式调用2.4第二次创建SuspendLambda子类对象(协程对象包... 查看详情
kotlin协程硬核解读(4.协程的创建和启动流程分析)(代码片段)
...函数1.5kotlin的函数类型Function1.6调用操作符()重载2.协程的启动、执行流程分析2.1CoroutineScope.launch()创建协程对象2.2initParentJob()父子Job绑定,传递取消2.3CoroutineStart启动模式调用2.4第二次创建SuspendLambda子类对象(协程对象包... 查看详情
kotlin协程协程启动①(协程构建器|launch构建器|async构建器|runblocking函数|deferred类)(代码片段)
...、协程构建器1、协程构建器概念协程需要协程构建器来启动,协程构建器就是CoroutineScope协程作用域的两个扩展函数;协程构建器:协程有两种构建器,调用CoroutineScope协程作用域的如下两个构建起可启动协程;launch构 查看详情
kotlin协程协程启动①(协程构建器|launch构建器|async构建器|runblocking函数|deferred类)(代码片段)
...、协程构建器1、协程构建器概念协程需要协程构建器来启动,协程构建器就是CoroutineScope协程作用域的两个扩展函数;协程构建器:协程有两种构建器,调用CoroutineScope协程作用域的如下两个构建起可启动协程;launch构 查看详情
深入理解kotlin协程协程作用域启动模式调度器异常和取消使用篇(代码片段)
startCoroutine和createCoroutine这两个API不太适合在业务开发中直接使用,因此对于协程的创建,框架中提供了不同目的的协程构造器。这两组 API的差异在千Receiver的有无。Receiver通常用千约束和扩展协程体,剩下的部分就... 查看详情
kotlin协程协程启动③(协程组合并发|挂起函数串行执行|协程组合并发执行挂起函数)(代码片段)
文章目录一、挂起函数串行执行二、协程组合并发执行挂起函数一、挂起函数串行执行在协程体中,连续使用多个挂起函数,这些函数的执行是顺序执行的,挂起函数1执行完毕后,才执行挂起函数2;packagekim.hsl.coroutineimportandroid.os.Bundle... 查看详情
kotlin协程(代码片段)
一、CoroutineScope协程作用域,通过socpe启动一个或者多个协程,同一个socpe启动都算他的子协程GlobalScope//全局协程,生命周期与app相同,调度器是默认调度器,线程池MainScope()//在主线程启动协程默认调度器是Mai... 查看详情