前言:
在上一次Kotlin协程调试与CoroutineName上下文元素组合详解中咱们对于协程的调试和给协程起名称进行了相关的学习,这次咱们来将焦点定位到协程范围(CoroutineScope)上来,关于这块其实在之前https://www.cnblogs.com/webor2006/p/11725866.html、https://www.cnblogs.com/webor2006/p/11730528.html已经详细研究过了,当我们在使用到协程的时候会涉及到如下几个关键元素或关键点:Job(本身协程执行的任务)、子协程、所运行的Context。而这次要学习的主题场景是Android的Activity,对于做过Android开发的人来说Activity应该是最最亲切的组件了,在Activity中我们做一些异步任务的时候都会开一个子线程去弄,否则就会ANR,比如说最典型的网络请求操作,而重点是如果我们的Activity如果退出了,其子线程应该也得退出,否则就会出现内存泄漏的情况出现,所以平常我们在使用像Okhttp来请求网络时在onDestroy处都会写上一个canTag()将其正在请求的异步网络给主动终止掉。
那上面说的跟咱们研究的主题有啥关系么?很大的关系,对于用Koltin来开发Android而言协程就代表了一个异步任务,而在使用协程时同样也得遵循当Activity被销毁时它里面开的若干个协程也能够终止掉,这也是咱们这次要来专门研究的主题,因为我们不可能针对不同的协程每个都单独去销毁,得要有一个统一的手段达成这个目的,这就是如标题所示的协程范围(CoroutineScope),
进一步了解CoroutineScope:
之前已经对于这个类曾研究过,这里打开这个类再来瞅一下,它里面有一个工厂函数,正好符合我们目前所要研究的场景:
而还有另外一个实现就正如我们所举的Android Activity的场景了,看一眼:
而Dispatchers.Main其实在之前也遇到过,只是没使用过,跟进去瞅一下:
这里大概读一下官方对它的说明:
而为啥之前看到了却木有使用它呢?因为:
下面再来读一下CoroutineScope官方的关键描述,回忆一下:
像平常我们大量用到的启动协程的launch就是CoroutineScope的扩展方法: