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) 上工作的协程调用这个函数。哪个比另一个更合适?
从技术上讲,两者是相同的,但当涉及到用例时,两者是不同的,并且对不同的用例有很大的影响,因此在使用它们时要小心
协程作用域:
协程作用域是协程的起点。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 Coroutine
or内部,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 相关内容,所以我们必须将上下文更改为main
withwithContext(main){}
并更新 UI。
还有其他用例,例如 liveData,我们正在使用 IoDispatcher 使用改造来获取值,然后在下一步中我们必须通过 use 将其设置为 liveData,withContext(main){}
因为我们无法在后台线程中观察 liveData 的值。
是的,我希望这有帮助。如果有任何问题请评论。
归档时间: |
|
查看次数: |
832 次 |
最近记录: |