[Android] Coroutine 一起来了解一下协程吧!

95 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

有AsyncTask,Coroutine,还有Rxjava,如果是异步的话你肯定会遇到很多,但是今天就来
了解一下Coroutine吧!

据说AsyncTask因为内存泄露等问题被谷歌弃用,所以推荐使用coroutines。

协程

特点

  1. 共享堆内存(线程分配到栈)
  2. 非抢占式多任务
  3. 并发编程(挂起)(并行X)
  4. 轻量级,减少内存泄漏(减少栈分配)

Coroutine Scope -> Coroutine Context -> Coroutine Builder

协程作用域

一个接口,用于确定在哪些范围内使用协程。
由于多个协程可以在一个进程中运行,因此用于防止内存泄漏。
因为 GlobalScope 是单例的,所以很少使用。

协程上下文

协程在定义为 Kotlin 标准库中定义的 CoroutineContext 的上下文中执行。
代表性元素包括 Dispatchers 和 Jobs。

  • 调度员

根据所使用的任务,有不同类型的调度程序- Dispatchers.Default:
当使用大量 CPU 操作时

  • Dispatchers.IO:本地 DB、文件 IO、网络 IO

  • Dispatchers.Main:UI 主线程

  • 工作

将协程做成对象称为作业,方便流程控制。
方法包括开始、取消和加入。

协程生成器

协程构建器是执行协程并创建协程对象的函数。

创建协程

  • launch:返回一个 Job 对象。执行协程并独立运行。
  • async:返回一个带值的 Deferred 对象。当需要并发操作的结果时使用。
  • runBlocking:返回一个 DeferredCoroutine 实例。当一个协程被挂起时,它会阻塞后面启动的线程,但它并没有被很好地使用。
  • withContext :切换调度程序。

协程延迟

  • delay:协程等待指定的时间量。
  • join :等待 launch 执行的协程。
  • await:等待使用异步执行的协程。

协程取消

  • cancel:使其进入取消状态。
  • cancelAndJoin:从取消状态变为取消状态。取消和加入的组合。
  • withTimeout:当一定时间过去并抛出 TimeoutCancellationException 时取消。
  • withTimeoutOrNull :如果经过特定时间,则取消并抛出 null 。

异常处理

  • 使用 CoroutineExceptionHandler 使用协程内部 trycatch。
  • 使用 launch 时立即出现异常。
  • 即使使用async时出现异常,也只有遇到await时才会出现异常。
  • 如果子协程发生异常,父协程也会被取消。