前言

kotlin中使用协程,是一定要跟协程作用域一起配合使用的,否则可能协程的生命周期无法被准确控制,造成内存泄漏或其他问题.

我们一般在安卓项目中使用协程作用域,可能会在BaseActtivity中new 一个MainScope(),并在onDestory时cancel掉,或者只在ViewModel中使用viewModelScope,然后会在ViewModel的onClose中自动cancel掉.

但我们可能不只需要这些效果,比如在协程作用域中拿到Context或Activity,或者需要统一的捕获异常,下面我们就来探讨一下如何创建一个好用的作用域.

正文

首先我们自己创建协程作用域需要调用CoroutineScope()方法,然后通过加号+拼接CoroutineContext

首先我们需要确认我们要什么Job,如果需要连带责任的(子协程取消,父协程也会取消),就使用Job().如果只能由父控制子的取消,就使用SupervisorJob()

然后确定我们的协程作用域是要默认运行在哪个线程中,一般安卓开发都是默认主线程,这里我们使用Dispatchers.Main.immediate,Dispatchers.Main.immediate和Dispatchers.Main的区别就是,Dispatchers.Main会直接post到主线程,而Dispatchers.Main.immediate如果发现自身是在主线程,就可能不再post一次,而是直接调度

然后我们可能需要对协程作用域中的异常进行统一处理,所以我们附加上一个异常处理器协程上下文元素:

/*** 设置协程异常策略的上下文元素*/
object CoroutineExceptionHandlerWithReleaseUploadAndDebugThrow: AbstractCoroutineContextElement(CoroutineExceptionHandler), CoroutineExceptionHandler {override fun handleException(context: CoroutineContext, exception: Throwable) {if (exception !is CancellationException) {//如果是SupervisorJob就不会传播取消异常,而Job会传播//todo 处理异常}}
}

我们为了方便调试,需要给协程作用域附加上名称,这里我们使用自带的协程上下文元素CoroutineName()

而我们可能需要通过协程作用域取到安卓的Context或者Activity等,这里我们也可以自定义一些协程上下文元素,如:

/*** 存储BaseActivity的协程属性*/
class CoroutineElementWithBaseActivity(val baseActivity: BaseActivity) :AbstractCoroutineContextElement(CoroutineElementWithBaseActivity) {companion object Key : CoroutineContext.Key<CoroutineElementWithBaseActivity>
}

这样我们可以在有协程作用域的地方取到activity并作出弹加载窗等操作:

完整代码如下:

end

Kotlin-如何创建一个好用的协程作用域相关推荐

  1. 【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )

    文章目录 一.协程概念 二.协程作用 三.创建 Android 工程并进行协程相关配置 1.创建 Android 工程 2.配置协程环境 3.布局文件 4.异步任务代码示例 5.协程代码示例 6.完整 ...

  2. java创建数组大小为n_如何通过提供大小在Kotlin中创建一个像Java一样的数组?

    根据 reference,数组按以下方式创建: >对于Java的原始类型,存在不同的类型IntArray,DoubleArray等,它们存储unboxed值. 它们是使用相应的构造函数和工厂函数 ...

  3. 一文快速入门 Kotlin 协程

    一.Kotlin 协程 Kotlin 协程提供了一种全新处理并发的方式,你可以在 Android 平台上使用它来简化异步执行的代码.协程从 Kotlin 1.3 版本开始引入,但这一概念在编程世界诞生 ...

  4. 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式

    前言 在Kotlin协程(后简称协程)出来之后,颠覆了我们很多工具类的封装方式,大大简化了我们很多api的调用,并且使异步操作逻辑更清晰了 其中一个很标志性的地方就属网络请求了,以前的网络请求方式声明 ...

  5. 一文看透 Kotlin 协程本质

    前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果--实在拿不出手! 为了更好的加深记忆和理解,更全 ...

  6. 十一、kotlin的协程(一)

    theme: Chinese-red 学习的前提 java线程需要大概知道点 协程是线程执行的任务, 协程和用户线程的区别在于, 协程背靠强大的编译器, 协程有专属于协程的调度器和一堆方便好用的函数, ...

  7. Kotlin新手入坑:协程基本使用以及API...|..ST

    Kotlin协程 前言 协程基本概念和使用 协程使用的基本函数 示例代码 抓住今天,尽可能少的信赖明天. 喝汤能补 (* ^ ▽ ^ *) 前言   该文章作为学习交流,如有错误欢迎各位大佬指正 (* ...

  8. 探索 Kotlin 协程原理

    接下来跟大家分享一下我在了解 Kotlin 协程实现的过程中理解的一些概念,如果你发现哪些地方我说错了的话,欢迎提出你的理解. 1. Kotlin 协程原理概述 Kotlin 协程的大致的执行流程如上 ...

  9. Kotlin协程简介(一)

    目录: 一. 协程的基本概念 二. 从异步编程开始 回调 CompletableFuture RxJava 协程 三. 协程的基本概念 suspend funtion CoroutineScope C ...

最新文章

  1. 机器学习(10)随机森林(预测泰坦尼克号旅客存活率)
  2. 注意!!一定要谨慎使用c/c++原生指针
  3. SSD 安装、训练、测试(ubuntu14.04+cuda7.5+openvc2.4.9)
  4. kernel: CPU9: Temperature above threshold
  5. js 即时上传php_php+js实现异步图片上传实例分享
  6. 前端工程师和数据科学的快乐
  7. HGsoft-downloader
  8. UVA-1635 数学
  9. GoC语言学习(C/C++程序设计语言入门)
  10. 如何将exe文件在linux下执行,如何轻松的在Linux中运行Windows的.exe文件
  11. linux下执行efi文件,在Linux下创建EFI BIOS Grub加载分区
  12. (概率论习题册题解)第二章 随机变量及其分布
  13. 基于单片机的功放protues_基于单片机的音乐播放器设计
  14. 面试产品经理 应该如何介绍自己的优势和劣势?
  15. 【分享】基于单片机家庭防盗报警系统设计-基于51单片机的智能照明控制系统-基于单片机电压控制灯光亮度报警系统-基于51单片机的公交车安全智能检测系统-基于51单片机的金属探测仪控制设计-毕设课设资料
  16. PV(访问量)、UV(独立访客)、IP(独立IP)
  17. 购买弹性云服务器怎么部署网站,购买后怎么部署自己的云服务器
  18. 如何计算802.11 PHY Data Rate (11ac/11ax)
  19. 视频教程-2020年软考网络规划设计师案例分析软考视频教程-软考
  20. 人人都应该用的 Python 开源库

热门文章

  1. python编程基础(一):编程思想
  2. 推荐系统笔记:基于矩阵分解(总结篇)
  3. 文巾解题1588. 所有奇数长度子数组的和
  4. Python应用实战-如何通过python对Excel进行常规性操作
  5. python和java对比并发_Python并发编程之从性能角度来初探并发编程(一)
  6. 深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天
  7. python3-matplotlib库简单入门
  8. StratifiedKFold()与KFold()比较
  9. 【Python刷题】_1
  10. 如何基于Redis Replication设计并实现Redis-replicator?