协程 : 也叫微线程或者轻量级线程,协程和线程的关系-类似于-线程和进程的关系
一个进程可以创建多个线程,一个线程可以创建多个协程(协程也可以嵌套协程)
特征:协程是运行在单线程中的并发程序(串行执行)
协程简单理解: 协程可以类比 Runnable,然后把Runnable加入到任务队列中等待被取出执行,但是这个Runnable有挂起和恢复
协程也可以类比Handler机制,协程像Message,往MessageQueue里加入等待被取出执行,但是这个Message有挂起和恢复功能
挂起和恢复功能:相当于让出这个Message任务的执行权,开始执行下一个Message,把当前的Message重新放入MessageQueue中,后面再执行该Message没有执行完的任务
协程简单使用:
// 方法一,使用 runBlocking 顶层函数 不推荐
// 阻塞协程,不执行完这个协程的时候,该线程会被阻塞,如果是主线程会阻塞到页面60帧的刷新任务
runBlocking {
getImage(imageId)
}
// 方法二,使用 GlobalScope 单例对象 可以直接调用 launch 开启协程 不推荐
// 生命周期和app同步,容易造成内存泄漏,除非手动取消该协程
GlobalScope.launch {
getImage(imageId)
}
// 方法三,自行通过 CoroutineContext 创建一个 CoroutineScope 对象 需要一个类型为 CoroutineContext 的参数 推荐
// withContext
val coroutineScope = CoroutineScope(context)
coroutineScope.launch {
val img = getImage(imageId)
withContext(Dispatchers.Main){ //自动切换到