美文网首页
3.协程的调度(1)

3.协程的调度(1)

作者: 学吉他的袁先生 | 来源:发表于2020-08-04 19:18 被阅读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()
    }
    

    相关文章

      网友评论

          本文标题:3.协程的调度(1)

          本文链接:https://www.haomeiwen.com/subject/bvvkrktx.html