gpt4 book ai didi

android - MainScope 与 GlobalScope

转载 作者:行者123 更新时间:2023-12-04 23:53:22 26 4
gpt4 key购买 nike

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?

MainScopeCoroutineScope使用 Dispatchers.Main dispatcher 默认绑定(bind)到主 UI 线程。 GlobalScopeCoroutineScope在其协程上下文中没有调度程序。这意味着在这个范围内启动的协程将使用 Dispatchers.Default调度程序,它由线程池支持(大小取决于您拥有的 CPU 内核数量)。 GlobalScope也没有 Job在其上下文中,这意味着结构化并发不适用。其中启动的协程永远不会自动取消,因此需要手动控制。这就是为什么通常不鼓励使用它,除非您有非常特殊的需求。

Only the original thread that created a view hierarchy can touch its views.


当您尝试从主线程外部修改 View 时会发生此错误,如果您从 GlobalScope 中启动的协程执行此操作会发生这种情况。 (因为它由一个单独的线程池支持)。
在您的第二个 fragment 中,您使用的是 withContext(Dispatchers.Default) ,这只会使这部分代码在该线程池上运行,而其余部分则在 UI 线程上运行。这就是 UI 更新正常的原因。
请注意,Room 已经使用带有后台线程池的调度程序进行查询,因此您不需要像这样手动切换上下文,您可以从 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com