上一篇中,我们抛出了一个问题:
有木有一种机制能够精确的等待协程执行完了,再执行主线程呢?
所以咱们需要改造一下,先把主线程的delay
给注释掉:
那怎么做呢?这里先来看一下GlobalScope.launch()方法的返回值:
咱们再来回顾一下之前Job的理论描述:
简单看一下官方的对它的说明:
其它的就暂且不读了,那能拿到Job是不是可以通过它来达到我们精准等待协程执行完的目的呢?所以首先咱们来获取它的返回值:
那重点就是怎么通过这个Job来达到我们的目的了, 其实它里面有一个跟咱们线程中一样的join()方法,不过实现肯定不同啦,瞅瞅:
所以咱们试试:
下面来运行一下看效果:
确实是如此,这次“Kotlin Coroutines”和"World"几乎是同时间输出了。
协程作用域:
先来回顾一下咱们之前的代码:
也就是我们用GlobalScope.lauch()
构造的协程中的代码是依附于主线程,如果主线程退出了,其协程也退出了【也可以这么理解:除非主线程退出,否则只要该协程不结束就会占用资源,这也是它可能导致无法预料的内存泄露,以至于kotlin不推荐使用它的原因】,然而!!看下面这个代码就会颠覆这个效果了,如下:
运行:
发现此时“hello”在输出之后,还在等待后台协程在“Kotlin Coroutines”输出完之后再退出,这是为啥呢?这里就涉及到了“协程作用域”的概念。
好,下面先来看下理论:
“每一个协程构建器
(包括runBlocking)都会向其代码块作用域中添加一个CoroutineScope实例
,我们可以在该作用域中启动协程,而无需
显示地将其join到一起,这是因为外部协程(在上面的示例中就是runBlocking)会等待该作用域中的所有启动的协程全部完成后才会完成。”
也就是说:
而回到之前的这段代码:
而如果不用GlobalScope
,而直接调用launch
,它其实创建的Scope
就是runBlocking
所创建的CoroutineScope
实例了,此时外部的协程就会等待里面的协程了,还是比较难理解的,所以我们就可以利用这个特性来比较巧妙的来达到文章开头想要实现的那个效果。
网友评论