android - Kotlin:覆盖协程的父作业
问题描述
我正在尝试将以下功能迁移到新Coroutine
的Kotlin 1.3
:
fun launchUI(strategy: CancelStrategy, block: suspend CoroutineScope.() -> Unit): Job {
return launch(context = UI, parent = strategy.jobs, block = block)
}
但是新GlobalScope.launch
函数没有parent
参数。文档说:
父作业也继承自 a
CoroutineScope
,但也可以用相应的coroutineContext
元素覆盖。
但我不知道如何覆盖父工作。我现在已经这样实现了,但我不确定它是否会以同样的方式工作:
fun launchUI(strategy: CancelStrategy, block: suspend CoroutineScope.() -> Unit): Job {
val job = GlobalScope.launch(context = Dispatchers.Main, block = block)
strategy.jobs.invokeOnCompletion {
job.cancel()
}
return job
}
谁能帮我?
更新:
class CancelStrategy(owner: LifecycleOwner, val jobs: Job) : LifecycleObserver {
init {
owner.lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
jobs.cancel()
}
}
解决方案
你的第二个例子是正确的。您可以使用plus
将作业添加为新协程的父作业。
fun launchUI(strategy: CancelStrategy, block: suspend CoroutineScope.() -> Unit): Job {
return GlobalScope.launch(context = Dispatchers.Main + strategy.jobs, block = block)
}
但GlobalScope
不鼓励使用 of。最好自己创建一个CoroutineScope
。你CancelStrategy
看起来是个不错的候选人。
class CancelStrategy(owner: LifecycleOwner, val jobs: Job) : LifecycleObserver, CoroutineScope {
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + jobs
init {
owner.lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
jobs.cancel()
}
}
现在你可以像这样启动你的协程:
cancelStrategy.launch { ... }
推荐阅读
- python-3.x - SQLAlchemy - 如何与中间关联表建立一对多关系
- c# - 建议 GetComponent<>() 进行变量赋值时如何推断类型?
- django-rest-framework - 当 DRF 的字段被命名为“产品”时,它返回为 None
- angular - 错误 NG8002:无法绑定到“dep”,因为它不是“app-add-edit-dep”的已知属性
- c++ - 如何拥有指向 CMSIS 定义的硬件外围设备的 constexpr 指针?
- android - 当我手动设置标签计数时,yAxis 标签从零开始
- c++ - Qt:通过透明小部件传播鼠标点击
- r - 谷歌地球引擎中的图像统计数据和 R 中的 rgee 包?
- splash-screen - pubspec.yaml 中的闪屏引发错误依赖项可能只有一个源
- google-sheets - 为什么在 Google 时间表上的持续时间总和总是返回零