1、suspend 被suspend修饰的函数 是挂起函数 只能被协程调用 或者被suspend修饰的函数调用
2、协程 参数
2.1 CoroutineContext CoroutineDispatcher Job
CoroutineContext 协程上下文,是一些元素的集合,主要包括Job CoroutineDispatcher 等元素 ,可以代表协程的一个场景。
CoroutineDispatcher 协程调度器,决定协程所在的线程或者线程池 。他可以指定协程运行与指定的线程、一个线程池或者不指定任何的线程(不指定协程运行在当前的线程)
coroutines-core中 CoroutineDispatcher 有三种标准实现Dispatchers.Default、Dispatchers.IO,Dispatchers.Main和Dispatchers.Unconfined,Unconfined 就是不指定线程。
launch函数定义如果不指定CoroutineDispatcher或者没有其他的ContinuationInterceptor,默认的协程调度器就是Dispatchers.Default,Default是一个协程调度器,其指定的线程为共有的线程池,线程数量至少为 2 最大与 CPU 数相同。
3 Job & Deferred
job 没有返回值
Deferred 是有返回值的 可以 取消
4 创建协程的几种方式
4.1 CoroutineScope.launch {}
不阻塞当前线程,在后台重新创建新的协程,也可以指定协程调度器。
4.2 runBlocking {}
runBlocking {}是创建一个新的协程同时阻塞当前线程,直到协程结束。这个不应该在协程中使用,主要是为main函数和测试设计的。
4.3 withContext {}
withContext {}不会创建新的协程,在指定协程上运行挂起代码块,并挂起该协程直至代码块运行完成。
4.4 async {}
CoroutineScope.async {}可以实现与 launch builder 一样的效果,在后台创建一个新协程,唯一的区别是它有返回值,因为CoroutineScope.async {}返回的是 Deferred 类型。