Kotlin协程知识点总结

作用域

    • GlobalScope 全局作用域
      • GlobalScope 是一个全局作用域,整个应用程序生命周期他都在运行,不能提前取消,所以一般不会使用这个作用域。
    • MainScope
      • MainScope 是一个方法,返回了一个运行在主线程的作用域,需要手动取消
    • lifecycleScope
      • 跟随lifecycleOwner的生命周期
    • viewModelScope
      • 跟随ViewModel的生命周期

创建方式

    • runBlocking:T 启动一个新的协程并阻塞调用它的线程,直到里面的代码执行完毕,返回值是泛型T,就是你协程体中最后一行是什么类型,最终返回的是什么类型T就是什么类型。
    • launch:Job 启动一个协程但不会阻塞调用线程,必须要在协程作用域(CoroutineScope)中才能调用,返回值是一个Job
    • async:Deferred<T> 启动一个协程但不会阻塞调用线程,必须要在协程作用域(CoroutineScope)中才能调用。以Deferred对象的形式返回协程任务。返回值泛型T同runBlocking类似都是协程体最后一行的类型。

调度器

    • Dispatchers.Main 运行在主线程,Android 平台就是 UI 线程,是单线程的
    • Dispatchers.Default 默认的调度器,如果上下文中未指定调度器,那么就是 Default。适合用来执行消耗 CPU 资源的计算密集型任务。它由 JVM 上的共享线程池支持。 默认情况下,此调度器使用的最大并行线程数等于 CPU 内核数,但至少为两个。
    • http://Dispatchers.IO IO 调度器,使用按需创建的线程共享池,适合用来执行 IO 密集型阻塞操作,比如 http 请求。此调度器默认并行线程数为内核数和 64 这两个值中的较大者。
    • Dispatchers.Unconfined 不限于任何特定线程的协程调度器,不常用

CoroutineExceptionHandler 异常处理器

上下文

    • CoroutineContext 由 Job、CoroutineDispatcher、CoroutineName、CoroutineExceptionHandler 组成。Job 可以控制协程的生命周期,也决定了子项异常时,父Job会不会取消。CoroutineDispatcher决定了协程运行在哪个线程。CoroutineName给协程起名字,用于调试时区分。CoroutineExceptionHandler 用于全作用域捕获并处理异常。子协程会自动继承父协程的CoroutineContext,并可以覆盖。CoroutineContext元素之间可以通过 + 运算符组合,也可以通过对应的key检索出CoroutineContext中的元素。

CoroutineStart 启动模式

    • 上边讲了 launch 和 async 的第二个参数就是 CoroutineStart,也就是协程的启动模式,共分为如下 4 种:

      DEFAULT-默认模式,立即调度协程;
      LAZY-仅在需要时才懒惰地启动协程,使用start()启动;
      ATOMIC-原子地(以不可取消的方式)调度协程,执行到挂起点之后可以被取消;
      UNDISPATCHED-同样是原子地(以不可取消的方式)执行协程到第一个挂起点。与ATOMIC的区别是:UNDISPATCHED不需要调度,直接执行的,而ATOMIC是需要调度后再执行的;UNDISPATCHED是在父协程指定的线程中执行,到达挂起点之后会切到自己上下文中指定的线程,ATOMIC是在自己的协程上下文中指定的线程执行。
      需要注意的是调度(schedules)和执行(executes)是不一样的,调度之后并不一定是立即执行。
  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值