注意:使用await时,协程启动方式只能用async(),因为launch()和async()虽然都是启动协程,但是返回结果不一样,launch()返回的是Job类型,async()返回的是Deferred<T>类型,所以async()能够接受各种返回值类型,而launch()不可以。 看例子,看例子 funtestAwait()=runBlocking{valtime=measureTimeMillis{vala1=async{Log....
而await()则有返回值,可以返回数据,要使用await(),必须使用GlobalScope.async来启动协程。再来看看上述启动代码的学习修改版本: suspendfunstartDownload(url:String):String?{println("### 1. startDownload start in${Thread.currentThread()}")varr=GlobalScope.async(Dispatchers.Default){println(" ### 2. sta...
runBlocking {valone=async { doSomethingUsefulOne() }valtwo=async { doSomethingUsefulTwo() } println("The answer is ${one.await() + two.await()}") } 此时, 总的执行时间约为 1秒. 结构化并发: suspend funconcurrentSum(): Int = coroutineScope {valone=async { doSomethingUsefulOne() }valtw...
官方只说了launch和async是CoroutineBuilder。但是对于 runBlocking 和 coroutineScope,它们同时具有作用域和构造器的特性,但是我们这里,不把他们当做构造器,只认为 launch 和 async 是构造器。 协程的两个启动方法 launch 不关心返回结果 Job async 可以返回结果 Deferred launch 和async 的对比 launch 和async 都是用来创...
我们需要重点关注await()方法,可以看到await()方法返回结果是T,说明我们可以通过await()方法获取执行流的返回值,当然如果出现异常或者被取消执行,则会抛出相对应的异常。 什么是作用域 协程作用域(Coroutine Scope)是协程运行的作用范围。launch、async都是CoroutineScope的扩展函数,CoroutineScope定义了新启动的协程作用范...
我们先看一下 启动协程构建函数; launch, async等 它们参数都差不多 public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit
launch,启动协程,不堵塞当前协程,无返回值,join方法会等待对应协程结束 async,启动协程,不堵塞当前协程,有返回值,join或者await方法会等待对应协程结束 withContext,启动协程,堵塞协程,有返回值,默认join。在suspend挂起方法里面,不能直接创建新协程,需要先获取作用域。
在kotlin 上,使用协程你只需要知道两个方法和他们的返回类型,就可以很熟练的用上协程了。分别是: fun launch(): Job fun async(): Deferred 1. 2. 7.3.1 launch方法 从方法名我们就能看出,launch表示启动一个协程。 public fun launch( context: CoroutineContext, ...
调用async 函数代码会执行,之后可以调用 deferred.await 函数来获取函数执行的返回结果。async 会开启协程去执行代码块里的代码,同时代码块最后一行代码会作为返回值返回,可以调用 await 函数来去获取返回的返回值。如果调用 await 函数的时候,协程还没有运行完,调用 await 函数的协程就会被挂起,一直等到 async 函数执行...