Kotlin创建一个好用的协程作用域 目录 前言 正文 前言 kotlin中使用协程,是一定要跟协程作用域一起配合使用的,否则可能协程的生命周期无法被准确控制,造成内存泄漏或其他问题. 我们一般在安卓项目中使用协程作用域,可能会在BaseActtivity中new 一个
目录
- 前言
- 正文
前言
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并作出弹加载窗等操作:
完整代码如下:
到此这篇关于Kotlin创建一个好用的协程作用域的文章就介绍到这了,更多相关Kotlin创建协程作用域内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
本文标题为:Kotlin创建一个好用的协程作用域
基础教程推荐
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- Flutter进阶之实现动画效果(三) 2022-10-28
- iOS开发使用XML解析网络数据 2022-11-12
- Android实现短信验证码输入框 2023-04-29
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- IOS获取系统相册中照片的示例代码 2023-01-03
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- iOS开发 全机型适配解决方法 2023-01-14
- Android开发Compose集成高德地图实例 2023-06-15