作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
GlobalScope 和 MainScope 有什么区别?
//Accessing data from Room
GlobalScope.launch {
v.tvStoreName.text = pfViewModel.getStoreName()
pageDetails.pageNumber = currentPage
pageDetails.pageSize = pageSize
pfViewModel.getTransactions(pageDetails, toolbarBuilder?.getDate()!!)
}
GlobalScope 有时会出现难以重现的错误。
Fatal Exception:android.view.ViewRootImpl$CalledFromWrongThreadException: Only theoriginal thread that created a view hierarchy can touch its views.
MainScope().launch {
var storeName = ""
withContext(Dispatchers.Default) {
storeName = pfViewModel.getStoreName()
}
v.tvStoreName.text = storeName
}
最佳答案
What is the difference between GlobalScope and MainScope?
MainScope
是
CoroutineScope
使用
Dispatchers.Main
dispatcher 默认绑定(bind)到主 UI 线程。
GlobalScope
是
CoroutineScope
在其协程上下文中没有调度程序。这意味着在这个范围内启动的协程将使用
Dispatchers.Default
调度程序,它由线程池支持(大小取决于您拥有的 CPU 内核数量)。
GlobalScope
也没有
Job
在其上下文中,这意味着结构化并发不适用。其中启动的协程永远不会自动取消,因此需要手动控制。这就是为什么通常不鼓励使用它,除非您有非常特殊的需求。
Only the original thread that created a view hierarchy can touch its views.
GlobalScope
中启动的协程执行此操作会发生这种情况。 (因为它由一个单独的线程池支持)。
withContext(Dispatchers.Default)
,这只会使这部分代码在该线程池上运行,而其余部分则在 UI 线程上运行。这就是 UI 更新正常的原因。
MainScope().launch { .. }
像这样是个坏主意,因为它与
GlobalScope
存在相同的取消问题.要正确使用它,您需要将此范围提取到变量/属性中,以便在适当时取消它。也就是说,使用现有范围更容易。安卓
already provides a ready-to-use coroutine scope在诸如具有生命周期的 Activity 的组件中(参见
lifecycle-runtime-ktx
库)。它被称为
lifecycleScope
.您应该在此范围内启动协程,以便在销毁 Activity 时自动取消它们。
关于android - MainScope 与 GlobalScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70208380/
GlobalScope 和 MainScope 有什么区别? //Accessing data from Room GlobalScope.launch { v.tvStore
这对启动需要在 fragment 生命周期之后继续的操作(如数据库写入)有意义吗? 代码示例: requireActivity().lifecycleScope.launch { /
我是一名优秀的程序员,十分优秀!