UI协程指南包含section,说明如何管理UI协程的生命周期。它说明了我们应该创建一个顶级Job
实例,并将复合协程上下文contextJob + UI
传递给我们启动的所有协程:
launch(contextJob + UI, block = block)
在我的项目中实施此模式时,我自然会使用contextJob
作为 parent :
launch(UI, parent = contextJob, block = block)
我还没有测试行为上的差异,但是我对这两个选项之间的语义差异很感兴趣。它们看起来与我非常相似,但是我更喜欢使用parent = contextJob
,因为它的作用更加明显。具体来说,我注意到parent
被允许为null
,但是如果我使用+
,则可能必须使用NonCancellable
作为空对象。
使用contextJob
作为parent
或launch
的{{1}}参数有什么问题吗?
答案 0 :(得分:2)
没有语义上的差异,将来也不会。
使用+
运算符的能力自然来自coroutineContext
机器:Job
是上下文元素,因此可以附加到上下文中。
但是写launch(UI + job)
似乎是不自然的,因为意图并不明确。将UI调度程序和某些工作串联起来意味着什么?
为了使这种模式更具可读性,添加了parent
参数,launch(UI, parent = job)
是一种更自然的方式来公开打算将工作作为给定父级的子级启动的意图。
在后台,它仍然可以连接上下文和父级,但是现在API对于用户来说看起来更漂亮。
请注意,其他库的元素也可以使用相同的方法,例如对于CoroutineExceptionHandler
,但这是一个折衷方案:要么您有一个带有许多默认参数的方法,要么牺牲了可读性并编写了launch(ctx + myExceptionHandler)
,所以决定只引入parent
参数作为最常见的一个。