目录
一、什么是协程
协程可理解为轻量级的线程,但其不是线程,而是基于线程的工具库。
协程的目的是减轻繁琐的异步操作,按同步编码习惯编写异步任务。
二、创建协程
launch:创建协程;
async:创建带返回值的协程,支持并发;
withContext:不创建新的协程,在指定协程运行;
runBlocking:类似 launch,但其 delay 方法会阻塞线程;
2.1 协程上下文(调度器)
Dispatchers.Main:当前协程在UI线程执行;
在主线程使用不一定立即执行,因为是用Handler方式发送任务;
Dispatchers.IO:在线程池执行,可以发送网络请求或执行IO任务;
Dispatchers.Default:在线程池执行,可以执行CPU密集型运算;
Dispatchers.unconfined:在当前线程执行;
2.2 启动方式
Default:创建就启动;
Lazy:需要时才启动;
2.3 Job
协程构造方法返回值
job.start:启动协程
job.join:等待协程执行完毕
job.cancel:取消协程
三、suspend关键字
修饰函数,被修饰的函数称作挂起函数,表示在当前线程挂起该协程任务,转到挂起函数内的线程中执行,原线程可执行其他任务,如刷新UI等。这叫非阻塞式挂起。
suspend修饰的函数只能在协程内或另一个挂起函数中调用。
四、协程挂起与恢复
协程内代码是顺序执行的,直到被挂起为止。
被挂起的协程不会继续执行,直到挂起结束且线程空闲时继续执行。
协程在哪个线程恢复,就在哪个线程继续执行。