首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与主线程和调度程序相关的协作和挂起

与主线程和调度程序相关的协作和挂起
EN

Stack Overflow用户
提问于 2022-09-12 07:26:59
回答 2查看 204关注 0票数 0

我读过一篇文章,内容如下:

*如果您使用高级挂起功能、高级RxJava或高级LiveData,备用机房将自动提供主安全性。

**网络库,例如Retrofit和Volley,管理它们自己的线程,当与Kotlin coroutines一起使用时,代码中不需要显式的主安全性。

所以我有两个问题:

  1. ,如果我在视图模型中有一个挂起函数,并且它有一个长期运行的任务,并且它不使用任何dispatcher。因此,如果我将从活动/片段调用这个函数,那么它是否会像我们没有定义的任何调度器那样工作,并阻止ui ?

如上述语句中所述,对于房间/改造,我们是否应该显式地使用dispatcher (在这些情况下类似于IO ),因为它们正在自己处理后台线程。

谷歌搜索了一下,没有得到确切的答案,所以发帖变得清晰起来。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-12 07:43:47

  1. 是的,挂起的函数将正常运行&除非使用阻塞协同线(如runBlockingwithContext )向UI返回值,否则不会阻塞UI。

简单的launch (即viewModelScope.launch )不会阻塞线程。

根据文档,

  1. 使用custom dispatcher来处理线程。

来自代码实验室文档:

兼有房间和装修,使挂起功能安全.

从Dispatchers.Main调用这些挂起函数是安全的,即使它们从网络获取并写入数据库。“房间”和“重新配置”都使用自定义调度程序,而不使用Dispatchers.IO。

Room将使用配置的默认查询和事务执行程序运行协同器。

改造将在引擎盖下创建一个新的调用对象,并在其上调用队列以异步发送请求。

票数 0
EN

Stack Overflow用户

发布于 2022-09-12 07:54:10

据我所知,

  1. 调用suspend函数时,需要提供一个协同作用域。因此,如果您提供Dispatcher.MainMainScope,它将阻止UI.

  1. 机房/翻新有隐含的协同作用范围。这意味着你不需要为他们提供。但是,当您调用房间/重装时,您将需要提供协同作用域,如1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73685803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档