一、Kotlin协程简介
协程基于线程,是轻量级线程。在Android中,协程主要用于解决两个问题:
- 处理耗时任务,这种任务常常会阻塞主线程。
- 保证主线程安全,即确保安全地从主线程调用任何的suspend函数。
协程让异步逻辑同步化,可以杜绝回调地狱。协程最核心的点就是,函数或者一段程序能够被挂起,稍后再在挂起的位置恢复。
常规的函数操作包括:invoke(call)和return,协程新增了suspend和resume。
- suspend:挂起或暂停,用于暂停执行当前的协程,并保存所有的局部变量。
- resume:用于让已经暂停的协程从其暂停处继续执行。
挂起函数
使用suspend关键字修饰的函数叫做挂起函数。
挂起函数只能在协程体内或其它挂起函数内调用。
为什么Kotlin语法要求挂起函数一定要运行在协程体内或者其他挂起函数中呢?
答案就是,任何一个协程体或者挂起函数中都有一个隐含的Continuation实例,编译器能够对这个实例进行正确传递,并将这个细节隐藏在协程的背后,让我们的异步代码看起来像同步代码一样。协程,就是一个支持挂起和恢复的程序,而Kotlin协程是基于Continuation来实现挂起和恢复的。
调度器
所有的协程必须在调度器中运行,即使它们在主线程中运行也是如此。
- Dispatchers.Main:Android上的主线程,用来处理UI交互和一些轻量级的任务:调用suspend函数,调用UI函数,更新LiveData。
- Dispatchers.IO:非主线程,专为磁盘和网络IO进行了优化:数据库、文件读写、网络处理。
- Dispatchers.Default:非主线程,专为CPU密集型任务进行了优化:数组排序、JSON数据解析、处理差异判断。
可以使用withContext切换调度器
suspend fun withContextFun(){
Executors.newSingleThreadExecutor()
.asCoroutineDispatcher()
.use {
dispatcher