协程:处理耗时任务,不阻塞主线程,保证主线程安全,同时还让耗时的异步任务同步化,杜绝回调地狱。协程就是让一个函数或者一段程序代码 挂起,稍后再在挂起的位置恢复
协程的挂起和恢复
suspend 挂起 暂停 暂停执行当前协程,并保存所有 的局部变量
resume 恢复暂停的协程继续执行。
挂起与阻塞
挂起: 记住这个挂起点, 你可以去做其他的事情, 当这个挂起点 恢复执行了,就会通知你,你在执行这个事。 主线程遇到挂起点,不管它,主线程可以干别的事情 ,当这个挂起结束了,直接执行就是了
阻塞:当前要做的事被阻塞了,你什么事也不干,坐等这个当前事恢复。
主线程被阻塞了,不能干别的事了,只有等当前阻塞的事情结束了,主线程才能继续执行。
协程调度器Dispatchers
Dispatchers.Default 默认的调度器,非主线程。 用于CPU密集型,不会有IO操作,做逻辑算法 ,数组排序,Json数据解析,
Dispatchers. Main 主线程 。 处理与UI的交互的逻辑:调用UI函数,更新LiveData Dispatchers.IO 非主线程。 网络请求,读取文件,网路请求
协程的作用域CoroutineScope:
咱们创建自定义协程,必须要指定其作用域。
GlobalScope: 全局协程作用域,顶级协程,生命周期是 进程 级别的,即时Activity/fragment销毁了,此协程仍然在执行。
MainScope: 只能在Activity中使用,当Activity销毁了,此协程也不存在了,在OnDestroy()方法中取消协程。
viewModelScope : 只能在ViewModel中使用,与ViewModel的生命周期绑定的
lifecycleScope: 只能在Activity fragment中使用,会绑定Activity fragment的生命周期,当Activity fragment 销毁了 此协程也不存在了。