2

UI 协程指南包含有关如何管理 UI 协程生命周期的部分。它解释了我们应该创建一个顶级Job实例并将复合协程上下文传递给contextJob + UI我们启动的所有协程:

launch(contextJob + UI, block = block)

在我的项目中实现此模式时,我很自然地改为使用contextJob

launch(UI, parent = contextJob, block = block)

我还没有测试过行为上的差异,但我对这两个选项之间的语义差异感兴趣。它们看起来与我非常相似,但我更喜欢使用它,parent = contextJob因为它的作用更明显。具体来说,我注意到这parent是允许的null,但如果我使用+,我可能不得不将其NonCancellable用作空对象。

contextJob用作or的parent参数有什么问题吗?launchactor

4

1 回答 1

2

没有语义差异,将来也不会。

使用运算符的能力+自然来自coroutineContext机器:Job是上下文元素,因此可以附加到上下文中。

但是写作launch(UI + job)似乎不自然,因为意图不明确。将 UI 调度程序和一些工作串联起来意味着什么?为了使这种模式具有可读性,parent添加了参数,launch(UI, parent = job)这是一种更自然的方式来公开作为给定父级的子级启动作业的意图。在底层,它仍然连接上下文和父级,但现在 API 对用户来说看起来更漂亮。

请注意,相同的方法可以用于其他库的元素,例如 for CoroutineExceptionHandler,但这是一个权衡:要么你有一个带有十几个默认参数的方法,要么你牺牲了可读性和 write launch(ctx + myExceptionHandler),所以决定只引入parent参数作为最常见的一种。

于 2018-06-27T12:01:20.430 回答