持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
协程
- 协程是基于线程,它是轻量级线程
- 协程让异步逻辑同步化,杜绝回掉地狱
- 协程的核心是 函数或者一段程序能够被挂起,稍后再挂起的位置恢复
协程在android中应用场景
- 处理耗时任务,这种任务常常会阻塞主线程
- 保证主线程安全(安全地从主线程调用任何suspend函数)
协程的挂起和恢复
- suspend 挂起或暂停,用于暂停执行当前协程,并保存所有局部变量。
- resume 用户让已暂停的协程从其暂停处继续执行。
使用suspend关键字修饰的函数叫作挂起函数,挂起函数只能在协程体内或者其他挂起函数内调用
挂起和阻塞的区别
阻塞:正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般将这种状态称为阻塞状态。
挂起:由于系统和用户的需要引入了挂起的操作,进程被挂起意味着该进程处于静止状态。如果进程正在执行,它将暂停执行,若原本处于就绪状态,则该进程此时暂不接受调度。
调度器
所有协程必须在调度器中运行,即使他们在主线程上运行也是一样
结构化并发
当某个协程任务丢失,无法追踪,会导致内存,CPU,磁盘等资源浪费,甚至发宋一个无用的网络请求,这种情况称为任务泄露。为了解决协程的这个任务泄露的问题,kotlin引入了结构化并发机制
结构化并发是指将并发任务统一管理,将同等级的并发任务放在同一个作用域中,使其可以统一启动,统一关闭。
结构化并发有几个好处:
- 当任务正在执行时,可以追踪这个任务
- 当任务不需要执行时,可以取消这个任务
- 当任务失败时,可以发出错误信号表明有错误发生
- 统一处理并发任务,避免任务泄漏
作用域:CoroutineScope
协程的作用域用于统一管理协程,包括跟踪所有协程和取消所有协程。
常见的协程作用域有:
- GlobalScope:它是一种顶级协程。生命周期是进程级别的,只要应用进程还在运行,即使 Activity 或 Fragment 被销毁,此作用域下的协程仍然会执行。
- MainScope:只能在 Activity 中使用,使用 MainScope 时,需要在 onDestroy 中调用 cancel() 取消协程。
- viewModelScope,只能在 ViewModel 中使用,它会绑定 ViewModel 的生命周期
- lifecycleScope,只能在 Activity、Fragment 中使用,它会绑定 Activity 和 Fragment 的生命周期。