3.协程的调度(1)

2020-08-04  本文已影响0人  学吉他的袁先生

上一张通过四种启动模式,我们知道只有调度器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()
}
上一篇下一篇

猜你喜欢

热点阅读