协程Api备忘录哈哈哈哈哈
原文链接:https:
根据这篇文章 自己跟着调试一遍 防止忘记 自己手打了一份出来 增加印象
* GlobalScope :单利对象 全局只有一个对象 作用域用于全局
* MainScope : 主线程协程作用域
*
*
* 创建"子协程"作用域:coroutineScope() 和 supervisorScope()
* tip:只能在一个已有的协程内调用
* ---coroutineScope :遇见异常会抛出 并且取消父协程和其他子协程
* ---supervisorScope : 出现异常不会影响其他子协程
*
*
* 创建协程:launch 和 async
* --- launch : 会返回一个「Job」 用于协程监督和取消 适用于无返回值的情况
* --- async : 会返回一个「Job」子类 「Deferred」 可以通过await 获取完成时的返回值
*
* 挂起:suspend : 这个关键字就是一个警告⚠️ 警告使用者 被修饰的方法将会是一个耗时的任务 被suspend修饰的方法 只能使用在协程 或 其他suspend 方法内
*
*
*
*
* 「Job」的API
* 协程状态
isActive: Boolean
isCancelled: Boolean
isCompleted: Boolean
children: Sequence<Job>
协程控制
cancel()
join()
cancelAndJoin()
cancelChildren()
attachChild(child: ChildJob)
「Job」的生命周期:
New 新建
Active 激活
Completing 完成中
Completed 已完成
Cancelling 取消中
Cancelled 已取消
「Job」的状态检查:
yield() 检查当前协程是否完成 如果完成 会抛出CancellationException
ensureActive()
isActive
协程的异常处理:
1:try catch 捕获 (无法捕获launch 和 async作用域内的异常)
2:CoroutineExceptionHandler 全局处理 只支持 launch
例子:
launch(Dispatchers.Main+CoroutineExceptionHandler{_,e->
//处理异常
Toast.makeText(this@MainActivity,"e",Toast.LENGTH_SHORT).show()
}) { throw NullPointerException() }
协程的启动模式:
1:DEFAULT = 创建后立即开始调度 调度前被取消 直接进入取消响应状态
2:LAZY = 懒加载 需要手动调用 start join await 才会开始调度 调度前被取消 会进入异常结束状态
@ExperimentalCoroutinesApi
3:ATOMIC,
@ExperimentalCoroutinesApi
4:UNDISPATCHED;
多协程间传递数据:Channel
**/