val scope = CoroutineScope(
Job() + Dispatchers.Main
)
scope.launch {
beforeExecute()
val result = withContext(dispatcher) { doInBackground(*params) }
if (!isCancelled) {
postExecute(result)
} else {
cancelled(result)
}
status = Status.FINISHED
}
scope.cancel()如果我将scope.cancel()放在外部启动,它会立即取消coroutine,而不会调用启动块code.Is ?为什么会发生这种情况?如果我想让coroutine在启动过程中执行代码,那么是否应该将取消放置在启动块的末尾?
更新
根据侯禄的回答和马科·托波尼克的评论,
“在启动结束时,我认为任务已经完成,您不需要手动取消Coroutine。
和
“一旦完成任务,协同线就会从内存中消失。
但是在第二种情况下,如果我启动另一次启动,它就会被执行,除非我们取消了第一次启动中的协同线,就像在案例1中那样。那么,在任务完成后,coroutine是否会在没有手动调用cancel()的情况下从内存中消失?Bcoz编译器将永远不知道它将执行的最后一个启动,在此之后,它需要结束coroutine。
案例1
scope.launch {
Log.e("Task","1");
scope.cancel()
}
scope.launch {
Log.e("Task","2");
}只打印任务1
案例2
scope.launch {
Log.e("Task","1");
}
scope.launch {
Log.e("Task","2");
}任务1和2都是打印的。
发布于 2021-03-16 09:36:45
您的代码可以转换为“在执行scope.launch之后立即取消给定的协同”,因此我认为这是预期的行为。
至于另一个问题,我们只想在执行过程中出现问题时取消协同机制--嘿,协同机制,在我给您的任务执行过程中。如果有什么不对的事情发生。自杀吧。因此,在启动结束时,我认为任务已经完成,您不需要手动取消Coroutine。
更新:我写这个作为答案,因为我不能在注释中写代码。
CoroutineScope被设计成对创建/启动/容纳协同线的对象的生命周期做出反应。因此,当您在CoroutineScope上调用cancel方法时,您将停止所有操作。停止而不是取消。由该作用域创建的所有子协同,它们正在执行的所有作业,全部取消,仅此而已。任务完成了。这就是为什么你不能在scope.cancel之后再启动一次
CoroutineScope将通过创建器和异步等构建器方法来创建并保存一堆Corrountine的引用。当你想要取消一个特定的Coroutine时。您需要取消由生成器返回的作业。而不是取消它们所在的范围。
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/launch.html
val job1 = scope.launch{ print('Task 1') }
job1.cancel()
val job2 = scope.launch{ print('Task 2') }任务2将以正常方式打印。
https://stackoverflow.com/questions/66651468
复制相似问题