协程一:认识kotlin协程

101 阅读2分钟

1. 协程是什么

协程基于线程,它是轻量级线程

协程让异步逻辑同步化,杜绝回调地狱

协程最核心的点就是,函数或者一段程序能够被挂起,稍后再在挂起的位置恢复

2. Android中协程解决什么问题

  1. 处理耗时任务
  2. 保证主线程安全

异步任务AsyncTask已经过时,建议使用协程替代AsyncTask

3. 协程的挂起与恢复

常规函数基础操作包括:invoke(或call)和return,协程新增了suspend和resume

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

4. 挂起函数

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

5. 调度器

所有协程必须在调度器中运行,即使它们在主线程也是如此

image.png

6. 结构化并发

使用结构化并发可以做到:

  • 取消任务,当某项任务不再需要时取消它
  • 追踪任务,当任务正在执行时,追踪它
  • 发出错误信号,当协程失败时,发出错误信号表明有错误发生

7. CoroutineScope

定义协程必须指定其CoroutineScope,它会跟踪所有协程,同样它还可以取消由它所启动的所有协程

常用的相关API有:

  • GlobalScope,生命周期是process级别的,即使Activity或Fragment已经被销毁,协程仍然在执行。
  • MainScope,在Activity中使用,可以在onDestroy()中取消协程
  • viewModelScope,只能在ViewModle中使用,绑定ViewModel的生命周期
  • lifecycleScope,只能在Activity、Fragment中使用,会绑定Activity和Fragment的生命周期

8. 上手指南

协程+Retrofit+ViewModel+LiveData+DataBinding

9. 协程调试

使用的是协程调试才可以打印出协程编号

image.png

设置 VM options 为 -Dkotlinx.coroutines.debug

image.png

这样打印出来的协程就有编号了

image.png

10. withContext{} 与launch{} 调度的区别:

  • withContext 在原有协程上切换线程
  • launch 创建一个新的协程来切换线程

参考:# android kotlin 协程(二) 基本入门2(PS: 根据上面的链接可以找到协程的系列博客,是系统学习协程的好资源)