CoroutineScope 和 withContext 之间的 Kotlin 区别

Geo*_*Cap 7 android kotlin kotlin-coroutines

要更改函数中的线程,我使用 CoroutineScope 或 withContext。我不知道有什么区别,但是使用 CourineScope 我也可以使用处理程序。

例子:

private fun removeViews(){
    CoroutineScope(Main).launch(handler){
        gridRoot.removeAllViews()
    }
}

private suspend fun removeViews(){
    withContext(Main){
        gridRoot.removeAllViews()
    }
}
Run Code Online (Sandbox Code Playgroud)

我从一个在后台线程 (IO) 上工作的协程调用这个函数。哪个比另一个更合适?

USM*_*man 2

从技术上讲,两者是相同的,但当涉及到用例时,两者是不同的,并且对不同的用例有很大的影响,因此在使用它们时要小心
协程作用域:
协程作用域是协程的起点。CoroutineScope 内部可以有多个协程,这使得协程具有层次结构。让我们想一想,Parent 有多个孩子。ThinkCoroutineScope是一位父母,该父母可以有多个孩子,这些孩子也是协程。这些孩子被称为job

private val coroutineScope = CoroutineScope()
    coroutineScope(IO).launch{
    val childOne = launch(Main){}
   val childTwo = launch(Main){}
}
Run Code Online (Sandbox Code Playgroud)

看到 childOne 和 childTwo 了吗?为什么我们需要这些?因为我们不能直接取消协程,所以没有这样的方法可以直接取消协程,要么协程完成,要么失败。但如果我们想取消它怎么办?在这种情况下我们需要job. 但需要注意的是,这些工作children与父母完全相关。父级是(IO),子级是(Main),这个父级是在 IO Dispatcher 中启动的,但是当涉及到这些子级时,他们将切换到(Main)并做他们的事情,但父级仍将处于(IO)切换孩子的调度员不会影响父母。
但是如果其中一个孩子出了问题会发生什么,在这种情况下我们会观看这个峰会:
https://www.youtube.com/watch?v
=w0kfnydnFWI 这个关于协程异常和取消的峰会。观看它,太神奇了...

withContext:
什么是 withContext?
withContext应该在 any Coroutineor内部,suspend fun因为withContext它本身是一个挂起函数。
withContext用于在不同情况下切换上下文,
但如何切换?


suspend fun fetchFromNetworkAndUpdateUI() {
    withContext(IO){
        println("Some Fake data from network")
    }
    
    withContext(Main){
        //updating Ui
        //setting that Data to some TextView etc
    }
    
}
Run Code Online (Sandbox Code Playgroud)

看代码,我们从网络异步获取数据,因为我们不想阻塞MainThread,然后我们切换上下文,为什么?因为我们无法在 IoDispatcher 中更新 UI 相关内容,所以我们必须将上下文更改为mainwithwithContext(main){}并更新 UI。
还有其他用例,例如 liveData,我们正在使用 IoDispatcher 使用改造来获取值,然后在下一步中我们必须通过 use 将其设置为 liveData,withContext(main){}因为我们无法在后台线程中观察 liveData 的值。
是的,我希望这有帮助。如果有任何问题请评论。