开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
有AsyncTask,Coroutine,还有Rxjava,如果是异步的话你肯定会遇到很多,但是今天就来
了解一下Coroutine吧!
据说AsyncTask因为内存泄露等问题被谷歌弃用,所以推荐使用coroutines。
协程
特点
- 共享堆内存(线程分配到栈)
- 非抢占式多任务
- 并发编程(挂起)(并行X)
- 轻量级,减少内存泄漏(减少栈分配)
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时才会出现异常。
- 如果子协程发生异常,父协程也会被取消。