Kotlin中协程理解与实战(一)
- 什么是协程
- 在Android中协程用来解决什么问题
- 协程是:
- suspend -也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量;
- resume -用于让已暂停的协程从其暂停处继续执行
- 挂起函数
- 调度器
- -Dispatchers.Main
- -Dispatchers.IO
- -Dispatchers.Default
- 协程的两部分
- Kotlind的协程实现分为两个层次
- 任务泄漏
- 结构化并发
- CoroutinScope
- 一.定义协程必须指定其CoroutineScope.它会跟踪所有协程,同样它还可以取消由它所启动的所有协程。
- 二.常用的相关API有:
- 协程的启动与取消
什么是协程
协程基于线程,它是轻量级线程
在Android中协程用来解决什么问题
1.处理耗时操作,这种任务常常会阻塞主线程。
2.保证主线程安全,即确保安全地从主线程调用任何suspend函数。
协程是:
协程让异步逻辑同步化,杜绝回调地狱。
协程最核心的点就是,函数或者一段程序就能够被挂起,稍后再在挂起的位置恢复。
#协程的挂起与恢复
常规函数基础操作包括:invoke(或call)和return,协程新增了suspend和resume:
suspend -也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量;
resume -用于让已暂停的协程从其暂停处继续执行
挂起函数
1.使用suspend关键字修饰的函数叫作挂起函数。
2.挂起函数只能在协程体内或其他挂起函数内调用
调度器
所有协程必须在调度器中运行,即使它们在主线程上运行也是如此
-Dispatchers.Main
Android 上的主线程, 用来处理UI交互和一些轻量级任务,
调用suspend函数
调用UI函数
更新LiveData
-Dispatchers.IO
非主线程,专为磁盘和网络IO进行优化
调用suspend函数
调用UI函数
更新LiveData
-Dispatchers.Default
非主线程,专为CPU密集型任务进行了优化
数组排序
JSON数据解析
处理差异判断
协程的两部分
Kotlind的协程实现分为两个层次
1.基础设施层,标准库的协程API,主要对协程提供了概念和语义上最基本的支持
2.业务框架层,协程的上层框架支持
任务泄漏
1.当某个协程任务丢失,无法追踪,会导致内存、CPU、磁盘等资源浪费,甚至发送一个无用的网络请求,这种情况称为任务泄漏。
2.为了能够避免协程泄漏,Kotlin引入了结构化并发机制。
结构化并发
使用结构化并发可以做到:
1.取消任务,当某项任务不再需要时取消它。
2.追踪任务,当任务正在执行时,追踪它。
3.发出错误信号,当协程失败时,发出错误信号表明有错误发生。
CoroutinScope
一.定义协程必须指定其CoroutineScope.它会跟踪所有协程,同样它还可以取消由它所启动的所有协程。
二.常用的相关API有:
1.GlobalScope,生命周期是process级别的,即使Activity或者Fragment已经被销毁,协程仍然在执行。
2.MainScope,在Activity中使用,可以在onDestroy()中取消协程。
3.viewModelScope,只能在ViewModel中使用,绑定ViewModel的生命周期。
4.lifecycleScope,只能在Activity、Fragment中使用,会绑定Activity和Fragment的生命周期。
协程的启动与取消
1.启动协程:启动构建器,启动模式,作用域构建器,Job的生命周期
2.取消协程:协程的取消,CPU密集型任务取消,协程取消的副作用,超时任务