上一张通过四种启动模式,我们知道只有调度器ok,才能执行协程里面的代码,
那么协程是如何调度的?
下面是CoroutineScope.launch的源码
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
}
参数start已经讲过,block: suspend CoroutineScope.() -> Unit这个是什么?
之前kotlin基础部分已经讲过,如果lambda表达式是函数调用的最后一个实参,它可以放到括号外面
所以可以这样写
GlobalScope.launch {
println(2)
println(Thread.currentThread().name)
}
suspend 表示挂起函数(后面会讲)
CoroutineScope.() -> Unit 表示用方法作为launch方法的参数表示一个不需要返回值的函数
为什么不是() -> Unit
下面的例子将展示T.() -> Unit跟() -> Unit的区别
fun <T : View> T.afterMersure(f: T.() -> Unit) {}
fun <T : View> T.afterMersure2(f: () -> Unit) {}
class Test1 {
val layout:LinearLayout?=null
fun test(){
layout?.afterMersure {
//这里面的作用域会跟LinearLayout一致
println(this)
shouldDelayChildPressedState()
}
layout?.afterMersure2 {
println(this.layout)
// shouldDelayChildPressedState()
}
}
}
到这里也就可以理解下面的代码
suspend fun main(){
val job = GlobalScope.launch {
log(this)
launch {
log(this)
}
}
job.join()
}
网友评论