我知道什么是作业(job)(协 routine 的句柄)、什么是调度程序(它在其上运行的线程池)和什么是CoroutineScope(好的,作用域,或者我们也可以说是一种组),但我不理解以下语法:

val scope = CoroutineScope(Job() + Dispatchers.Main)

为什么Job()分中会有一个及格?不管怎么说,我传给CoroutineScope的是什么,是不是Lambda?据我所知,一个人做这样的事情会创造each个新的工作岗位:

val job = scope.launch { ... }

那么,为什么要将Jobsingle实例传递给CoroutineScope(Job() + Dispatchers.Main)中的CoroutineScope呢?

推荐答案

这是一个令人困惑的工作是什么意思的过载.每个协程作业(job)都有一个父作业(job).即使是直接从CoroutineScope启动的最顶层的协程也有一个父作业(job),在本例中,它是一个isn'ta协程的作业(job).

您传递给CoroutineScope"构造函数*"的作业(job)是由该作用域直接启动的协程的父作业(job).它本身并不代表协程,但它将具有子协程.

CoroutineContext始终包括作为当前协程的父级的作业(job),并且始终包括管理正在使用的线程的调度程序.当您深入到协程的嵌套lambdas中时,内部的launchasyncwithContext块可能会局部修改CoroutineContext.

代码Job() + Dispatchers.Default创建了一个具有这两个元素的CoroutineContext.**

实际上没有必要将纯Job()传递给CoroutineScope构造函数,因为如果省略它,无论如何都会生成一个,因为它是必需的元素.

更常见的是传递一个SupervisorJob()作为默认CoroutineContext的一部分.这种类型的作业(job)允许其子协同 routine 彼此独立地失败(一个失败的协同 routine 不会导致其余的协同 routine 被取消).人们通常希望CoroutineScope的这种行为将用于运行可能不相互依赖的多个协程.这就是lifecycleScopeviewModelScope是如何在Android的引擎盖下创建的.

除了作业(job)和调度程序,我认为使用+ CoroutineName("...")也是一个好主意,这样您的错误日志(log)会更有帮助.


*它实际上只是一个看起来像构造函数的函数.

**CoroutineContext的行为类似于一个不可变的Map,其中它的键是JOB、CoroutineInterceptor(Dispatcher的超类型)、CoroutineName和CoroutineExceptionHandler的伴随对象.当您在CoroutineContext元素上使用+时,它会将它们合并到一个新的CoroutineContext中,该新的CoroutineContext仍然 for each 键都有一个值.我认为可以创建您自己的密钥,并使用它们来附加传递到协程中的额外数据,但我从未try 过这一点.

Android相关问答推荐

Jetpack编写Lazy列滑动删除动画不顺利结束

Android Compose Pages 3-一次加载所有页面,无需在LazyColumn中滚动,无需网络调用和内部滚动

为什么Kotlin允许将非空值类型化为可空类型,但又将其视为非空值?

Android Studio SQLite 错误:列不正确(没有这样的列:_id)

Android 不在后台更新位置

减少Compose中可滚动选项卡之间的间距

Android Jetpack Compose全宽度抽屉优化

为一组闪烁的可组合项制作动画,控制同步/定时

在 Jetpack Compose 中使用 .observeAsState() 时,如何在更改 MutableLiveData 的值后开始执行一段代码?

Jetpack Compose Arc 进度条动画(如何重启动画)

ImageBitmap 使用 Glide/Coil 到画布

调用时 listFiles() nullpointerexception

Jetpack compose 未解决的参考错误

记住或不记得derivedStateOf

新的内部测试应用程序版本不适用于测试人员,即使它说它们是

如何在 Android 上移动 EditText 上的图标?

我的 react native 项目的发布签名 apk 没有在设备中打开,而且它创建的尺寸非常小

Android Jetpack Compose - 找不到 R.drawable?

关于launchWhenX和repeatOnLifecycle的问题

Jetpack Compose 中的按钮上的文本未更新