1. 协程是什么
协程基于线程,它是轻量级线程
协程让异步逻辑同步化,杜绝回调地狱
协程最核心的点就是,函数或者一段程序能够被挂起,稍后再在挂起的位置恢复
2. Android中协程解决什么问题
- 处理耗时任务
- 保证主线程安全
异步任务AsyncTask已经过时,建议使用协程替代AsyncTask
3. 协程的挂起与恢复
常规函数基础操作包括:invoke(或call)和return,协程新增了suspend和resume
- suspend - 也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量
- resume - 用于让已暂停的协程从其暂停处继续执行
4. 挂起函数
- 使用suspend关键字修饰的函数叫做挂起函数
- 挂起函数只能在协程体内或其他挂起函数内调用
5. 调度器
所有协程必须在调度器中运行,即使它们在主线程也是如此
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. 协程调试
使用的是协程调试才可以打印出协程编号
设置 VM options 为 -Dkotlinx.coroutines.debug
这样打印出来的协程就有编号了
10. withContext{} 与launch{} 调度的区别:
- withContext 在原有协程上切换线程
- launch 创建一个新的协程来切换线程
参考:# android kotlin 协程(二) 基本入门2(PS: 根据上面的链接可以找到协程的系列博客,是系统学习协程的好资源)