Kotlin-如何创建一个好用的协程作用域
前言
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-如何创建一个好用的协程作用域相关推荐
- 【Kotlin 协程】协程简介 ( 协程概念 | 协程作用 | 创建 Android 工程并进行协程相关配置开发 | 异步任务与协程对比 )
文章目录 一.协程概念 二.协程作用 三.创建 Android 工程并进行协程相关配置 1.创建 Android 工程 2.配置协程环境 3.布局文件 4.异步任务代码示例 5.协程代码示例 6.完整 ...
- java创建数组大小为n_如何通过提供大小在Kotlin中创建一个像Java一样的数组?
根据 reference,数组按以下方式创建: >对于Java的原始类型,存在不同的类型IntArray,DoubleArray等,它们存储unboxed值. 它们是使用相应的构造函数和工厂函数 ...
- 一文快速入门 Kotlin 协程
一.Kotlin 协程 Kotlin 协程提供了一种全新处理并发的方式,你可以在 Android 平台上使用它来简化异步执行的代码.协程从 Kotlin 1.3 版本开始引入,但这一概念在编程世界诞生 ...
- 超简单-用协程简化你的网络请求吧,兼容你的老项目和旧的网络请求方式
前言 在Kotlin协程(后简称协程)出来之后,颠覆了我们很多工具类的封装方式,大大简化了我们很多api的调用,并且使异步操作逻辑更清晰了 其中一个很标志性的地方就属网络请求了,以前的网络请求方式声明 ...
- 一文看透 Kotlin 协程本质
前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果--实在拿不出手! 为了更好的加深记忆和理解,更全 ...
- 十一、kotlin的协程(一)
theme: Chinese-red 学习的前提 java线程需要大概知道点 协程是线程执行的任务, 协程和用户线程的区别在于, 协程背靠强大的编译器, 协程有专属于协程的调度器和一堆方便好用的函数, ...
- Kotlin新手入坑:协程基本使用以及API...|..ST
Kotlin协程 前言 协程基本概念和使用 协程使用的基本函数 示例代码 抓住今天,尽可能少的信赖明天. 喝汤能补 (* ^ ▽ ^ *) 前言 该文章作为学习交流,如有错误欢迎各位大佬指正 (* ...
- 探索 Kotlin 协程原理
接下来跟大家分享一下我在了解 Kotlin 协程实现的过程中理解的一些概念,如果你发现哪些地方我说错了的话,欢迎提出你的理解. 1. Kotlin 协程原理概述 Kotlin 协程的大致的执行流程如上 ...
- Kotlin协程简介(一)
目录: 一. 协程的基本概念 二. 从异步编程开始 回调 CompletableFuture RxJava 协程 三. 协程的基本概念 suspend funtion CoroutineScope C ...
最新文章
- 机器学习(10)随机森林(预测泰坦尼克号旅客存活率)
- 注意!!一定要谨慎使用c/c++原生指针
- SSD 安装、训练、测试(ubuntu14.04+cuda7.5+openvc2.4.9)
- kernel: CPU9: Temperature above threshold
- js 即时上传php_php+js实现异步图片上传实例分享
- 前端工程师和数据科学的快乐
- HGsoft-downloader
- UVA-1635 数学
- GoC语言学习(C/C++程序设计语言入门)
- 如何将exe文件在linux下执行,如何轻松的在Linux中运行Windows的.exe文件
- linux下执行efi文件,在Linux下创建EFI BIOS Grub加载分区
- (概率论习题册题解)第二章 随机变量及其分布
- 基于单片机的功放protues_基于单片机的音乐播放器设计
- 面试产品经理 应该如何介绍自己的优势和劣势?
- 【分享】基于单片机家庭防盗报警系统设计-基于51单片机的智能照明控制系统-基于单片机电压控制灯光亮度报警系统-基于51单片机的公交车安全智能检测系统-基于51单片机的金属探测仪控制设计-毕设课设资料
- PV(访问量)、UV(独立访客)、IP(独立IP)
- 购买弹性云服务器怎么部署网站,购买后怎么部署自己的云服务器
- 如何计算802.11 PHY Data Rate (11ac/11ax)
- 视频教程-2020年软考网络规划设计师案例分析软考视频教程-软考
- 人人都应该用的 Python 开源库
热门文章
- python编程基础(一):编程思想
- 推荐系统笔记:基于矩阵分解(总结篇)
- 文巾解题1588. 所有奇数长度子数组的和
- Python应用实战-如何通过python对Excel进行常规性操作
- python和java对比并发_Python并发编程之从性能角度来初探并发编程(一)
- 深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天
- python3-matplotlib库简单入门
- StratifiedKFold()与KFold()比较
- 【Python刷题】_1
- 如何基于Redis Replication设计并实现Redis-replicator?