kotlin练习 - 协程
GlobalScope构造函数
- launch : 创建协程
- async : 创建带返回值的协程,返回 Deferred
- withContext : 不会创建新的协程,在指定协程上运行代码块
- runBlocking : 不是GlobalScope的API,可以单独使用, runBlocking里面的delay()会堵塞当前线程,launch等不会堵塞
1 | fun main(arg: Array<String>) { |
CoroutineContext协程运行的线程调度器
- Dispatchers.Default : 默认(如果不写,默认就是Dispatchers.Default模式)
- Dispatchers.IO : IO线程
- Dispatchers.Main : 主线程
- Dispatchers.Unconfined : 没指定,就是在当前线程
CoroutineStart 启动模式
- CoroutineStart.DEFAULT:默认(如果不写,默认就是CoroutineStart.DEFAULT模式)
- CoroutineStart.ATOMIC:自动(协程在开始执行之前不能被取消)
- CoroutineStart.UNDISPATCHED:立即执行协程
- CoroutineStart.LAZY:懒加载
Job方法
-
job.start() : 启动协程,除了 lazy 模式,协程都不需要手动启动
-
job.join() : 等待协程执行完毕后再执行后面的代码块
-
job.cancel() : 取消一个协程
协程的取消有些特质,因为协程内部可以在创建协程的,这样的协程组织关系可以称为父协程,子协程:- 父协程手动调用 cancel() 或者异常结束,会立即取消它的所有子协程
- 父协程必须等待所有子协程完成(处于完成或者取消状态)才能完成
- 子协程抛出未捕获的异常时,默认情况下会取消其父协程
-
job.cancelAndJoin() : 等待协程取消完毕后再执行后面的代码块
-
job.isActive : true - 处于活动状态
-
job.isCancelled : true - 已完成
-
job.isCompleted : true - 已取消
第一个协程程序
1 | import kotlinx.coroutines.GlobalScope |
桥接阻塞与非阻塞的世界
1 |
|
1 | import kotlinx.coroutines.* |
等待工作
1 |
|
结构化的并发
1 |
|
范围构建器
1 |
|
提取函数重构
1 | import kotlinx.coroutines.* |
协同程序重量轻
1 | import kotlinx.coroutines.* |
全局协程像守护线程
1 |
|
协程请求网络数据
1 | class MainActivity : AppCompatActivity() { |