Kotlin创建一个好用的协程作用域

 更新时间:2022年07月21日 16:42:41   作者:​ 李小白lt​  
这篇文章主要介绍了Kotlin创建一个好用的协程作用域,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并作出弹加载窗等操作:

完整代码如下:

到此这篇关于Kotlin创建一个好用的协程作用域的文章就介绍到这了,更多相关Kotlin创建协程作用域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Android MediaRecorder录制视频过短问题

    解决Android MediaRecorder录制视频过短问题

    本文主要介绍Android MediaRecorder,在使用MediaRecorder时经常会遇到视频录制太短问题,这里提供解决问题的实例代码以供大家参考
    2016-07-07
  • Android计时与倒计时实现限时抢购的5种方法

    Android计时与倒计时实现限时抢购的5种方法

    这篇文章主要为大家详细介绍了Android计时与倒计时实现限时抢购的5种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • TextInputLayout输入框控件的悬浮标签

    TextInputLayout输入框控件的悬浮标签

    这篇文章主要为大家详细介绍了TextInputLayout输入框控件的悬浮标签,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Android之来电秀实战示例

    Android之来电秀实战示例

    这篇文章主要为大家介绍了Android之来电秀实战示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Android 获取实时网速实现详解

    Android 获取实时网速实现详解

    这篇文章主要为大家介绍了Android 获取实时网速实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android实现多参数文件和数据上传

    Android实现多参数文件和数据上传

    这篇文章主要为大家详细介绍了Android实现多参数文件和数据上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Android处理图像数据转换的各种方法

    Android处理图像数据转换的各种方法

    这篇文章主要介绍了Android处理图像数据转换的各种方法,本文讲解了RGB值转Bitmap、Color值转Bitmap、字节数组转Bitmap、读取文件转Bitmap、读取资源转Bitmap、输入流转Bitmap等内容,需要的朋友可以参考下
    2015-01-01
  • Android组件之间交互核心Intent用法分析

    Android组件之间交互核心Intent用法分析

    这篇文章主要介绍了Android组件之间交互核心Intent用法,结合实例形式分析了Intent实现组件之间交互的步骤与相关技巧,需要的朋友可以参考下
    2016-06-06
  • Android教你如何发现APP卡顿的实现

    Android教你如何发现APP卡顿的实现

    这篇文章主要介绍了Android教你如何发现APP卡顿的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Android自定义ImageView实现自动放大缩小动画

    Android自定义ImageView实现自动放大缩小动画

    这篇文章主要为大家详细介绍了Android自定义ImageView实现自动放大缩小动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论