android - CoroutineScope 和 withContext 之间的 Kotlin 区别
问题描述
要更改函数中的线程,我使用 CoroutineScope 或 withContext。我不知道有什么区别,但是使用 CourineScope 我也可以使用处理程序。
例子:
private fun removeViews(){
CoroutineScope(Main).launch(handler){
gridRoot.removeAllViews()
}
}
private suspend fun removeViews(){
withContext(Main){
gridRoot.removeAllViews()
}
}
我从一个在后台线程 (IO) 上工作的协程调用这个函数。有比另一个更合适的吗?
解决方案
这两者实际上是完全不同的,你只是碰巧有一个你没有体验到差异的用例:
CoroutineScope(Main).launch(handler){
这会启动一个独立运行的并发协程。
withContext(Main){
这是一个仅在其内部的代码完成时才完成的函数,并返回其结果。这是你应该这样做的方式。
第一种方法 withCoroutineScope
有另一个缺陷,它绕过了结构化并发。您创建了一个没有父级的临时协程范围,因此如果需要更长的时间才能完成并且您的 GUI 被删除(用户导航离开当前活动),则不会自动清理。
你实际上不应该使用这个CoroutineScope(Main)
成语,我认为没有一个实例是合适的。如果你明确地想避免结构化并发,写起来还是更好更干净
GlobalScope.launch(Main + handler) {
并且具有几乎相同的效果。
如果您想要一个适合结构化并发的并发协程,请使用
fun CoroutineScope.removeViews() {
launch {
gridRoot.removeAllViews()
}
}
注意我删除了handler
参数,子协程忽略它,因为它将任何失败转发给它的父协程,这正是你想要的。父协程应该安装一个异常处理程序。