特点:
- 实现简单
- 比线程性能消耗的少很多
协程必须运行中协程作用域中,即CoroutineScope
- launch:无法返回
- async: 接收返回
suspend:挂起函数,和生命周期没有关系,离开理解后,还需要继续执行的任务。
最简单的协程例子
1 | GlobalScope.launch { // 在后台启动一个新的协程,不阻塞UI线程,1秒后输出 |
调度器:
Dispatchers.Main: 主线程(UI线程)
Dispatchers.IO: IO线程,优化磁盘读写和网络读写
Dispatchers.Default: 优化CPU大量工作
1 | GlobalScope.launch { |
使用withContext(Dispatchers.IO)切换调度器:
1 | // Dispatchers.Main |
launch启动一个无需返回的协程
1 | scope.launch { |
async启动一个等待返回的协程
ViewModel中使用协程
使用viewModelScope.launch{}
viewModelScope 会在对应的 ViewModel 清除的时候(onCleared() 被回调时)自动的清空所有的已启动的协程。
结构化并发
- 不需要时取消
- 工作时跟踪
- 失败时发出错误