请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于协程作用域的一点疑问

首先我们知道completion是AbstractCoroutine的子类,所以它是一个CoroutineScope。

而如果在协程体中继续调用其他的suspend函数,比如叫A函数,则A函数参数传递进来的continuation是协程本体SuspendLambda,并不是completion,所以它并不是一个CoroutineScope。

老师也说,通过coroutineScope函数可以在suspend函数中获取到当前的协程作用域,我看了下,这个函数只是对传递进来的SuspendLambda进行了包装,创建了一个新的AbstractCoroutine子类对象ScopeCoroutine作为它的CoroutineScope。

问题在于,协程的CoroutineScope实际上是completion,supend函数中的CoroutineScope是ScopeCoroutine,它们两个之间没有任何关系吧?为什么说coroutineScope函数可以获取到当前的协程作用域呢?

正在回答

1回答

其实要理解作用域从效果上来看就是异常处理取消响应以及协程的父子关系,但实际上这些关联都是通过上下文实现的。

coroutineScope 本身的含义就是默认的父子关系,使用他只不过是拿到一个CoroutineScope类型的实例而已。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕雪4289266 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-10-29 14:55:52
  • 提问者 慕雪4289266 #2
    CoroutineScope只要求实现一个coroutineContext属性,这个属性可以说是实现协程父子关系的纽带!子协程通过这个context可以轻松的继承父协程的上下文!也可以轻松的获取到父协程的Job实例来做一些操作!比如注册取消回调和处理异常等等!
    回复 有任何疑惑可以回复我~ 2020-10-29 15:39:56
  • bennyhuo 回复 提问者 慕雪4289266 #3
    说的对
    回复 有任何疑惑可以回复我~ 2020-10-30 14:08:01
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信