Kotlin - 协程学习第一天

166 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

协程

  • 协程是基于线程,它是轻量级线程
  • 协程让异步逻辑同步化,杜绝回掉地狱
  • 协程的核心是 函数或者一段程序能够被挂起,稍后再挂起的位置恢复

协程在android中应用场景

  • 处理耗时任务,这种任务常常会阻塞主线程
  • 保证主线程安全(安全地从主线程调用任何suspend函数)

协程的挂起和恢复

  • suspend 挂起或暂停,用于暂停执行当前协程,并保存所有局部变量。
  • resume 用户让已暂停的协程从其暂停处继续执行。

使用suspend关键字修饰的函数叫作挂起函数,挂起函数只能在协程体内或者其他挂起函数内调用

挂起和阻塞的区别

阻塞:正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般将这种状态称为阻塞状态。

挂起:由于系统和用户的需要引入了挂起的操作,进程被挂起意味着该进程处于静止状态。如果进程正在执行,它将暂停执行,若原本处于就绪状态,则该进程此时暂不接受调度。

调度器

所有协程必须在调度器中运行,即使他们在主线程上运行也是一样

image.png

结构化并发

当某个协程任务丢失,无法追踪,会导致内存,CPU,磁盘等资源浪费,甚至发宋一个无用的网络请求,这种情况称为任务泄露。为了解决协程的这个任务泄露的问题,kotlin引入了结构化并发机制

结构化并发是指将并发任务统一管理,将同等级的并发任务放在同一个作用域中,使其可以统一启动,统一关闭。

结构化并发有几个好处:

  • 当任务正在执行时,可以追踪这个任务
  • 当任务不需要执行时,可以取消这个任务
  • 当任务失败时,可以发出错误信号表明有错误发生
  • 统一处理并发任务,避免任务泄漏

作用域:CoroutineScope

协程的作用域用于统一管理协程,包括跟踪所有协程和取消所有协程。

常见的协程作用域有:

  • GlobalScope:它是一种顶级协程。生命周期是进程级别的,只要应用进程还在运行,即使 Activity 或 Fragment 被销毁,此作用域下的协程仍然会执行。
  • MainScope:只能在 Activity 中使用,使用 MainScope 时,需要在 onDestroy 中调用 cancel() 取消协程。
  • viewModelScope,只能在 ViewModel 中使用,它会绑定 ViewModel 的生命周期
  • lifecycleScope,只能在 Activity、Fragment 中使用,它会绑定 Activity 和 Fragment 的生命周期。