协程Coroutines

Posted by アライさん on 2019年11月14日

特点:

  • 实现简单
  • 比线程性能消耗的少很多

协程必须运行中协程作用域中,即CoroutineScope

  • launch:无法返回
  • async: 接收返回

suspend:挂起函数,和生命周期没有关系,离开理解后,还需要继续执行的任务。

最简单的协程例子

1
2
3
4
GlobalScope.launch { // 在后台启动一个新的协程,不阻塞UI线程,1秒后输出
delay(1000L) //等待 1 秒钟(默认时间单位是毫秒)
Log.d("tag","hello world")
}

调度器:
Dispatchers.Main: 主线程(UI线程)
Dispatchers.IO: IO线程,优化磁盘读写和网络读写
Dispatchers.Default: 优化CPU大量工作

1
2
3
4
5
6
GlobalScope.launch {
//do something
withContext(Dispatchers.Main)
{
}
}

使用withContext(Dispatchers.IO)切换调度器:

1
2
3
4
5
6
7
8
9
10
11
12
13
// Dispatchers.Main
suspend fun fetchDocs() {
// Dispatchers.Main
val result = get("developer.android.com")
// Dispatchers.Main
}
// Dispatchers.Main
suspend fun get(url: String){
withContext(Dispatchers.IO) {
// Dispatchers.IO
}
// Dispatchers.Main
}

launch启动一个无需返回的协程

1
2
3
scope.launch {
fetchUrl()
}

async启动一个等待返回的协程

ViewModel中使用协程

使用viewModelScope.launch{}
viewModelScope 会在对应的 ViewModel 清除的时候(onCleared() 被回调时)自动的清空所有的已启动的协程。

结构化并发

  • 不需要时取消
  • 工作时跟踪
  • 失败时发出错误