Kotlin Coroutines 中的 main-safe 是啥?
Posted
技术标签:
【中文标题】Kotlin Coroutines 中的 main-safe 是啥?【英文标题】:What does main-safe in Kotlin Coroutines?Kotlin Coroutines 中的 main-safe 是什么? 【发布时间】:2020-07-12 17:58:17 【问题描述】:我正在学习 Kotlin 的协程。文字A来自https://codelabs.developers.google.com/codelabs/kotlin-coroutines/#8
Kotlin Coroutines 中的 main-safe 是什么?
是否意味着系统会在需要时自动在后台线程中运行它们?
这是否意味着我永远不会在 Room 和 Retrofit 操作中使用 withContext(Dispatchers.IO)
之类的代码?
文字A
Room 和 Retrofit 都使挂起功能成为主要安全的。 从 Dispatchers.Main 调用这些挂起函数是安全的,即使它们从网络获取并写入数据库。
【问题讨论】:
【参考方案1】:对于我作为一名 android 开发人员来说,这个简单的定义非常合理
当一个函数不阻止 UI 更新时,我们认为它是主安全的 主线程。
在这里找到它https://developer.android.com/kotlin/coroutines
【讨论】:
【参考方案2】:main-safe [对] Kotlin Coroutines 意味着什么?
你自己直接引用答案:
从 Dispatchers.Main 调用这些挂起函数是安全的,即使它们从网络获取并写入数据库。
以及答案
这是否意味着我永远不会在 Room 和 Retrofit 操作中使用 withContext(Dispatchers.IO) 之类的代码?
is:正确(假设您正确配置它们,例如在 Retrofit fun 定义中使用 suspend
修饰符)。
【讨论】:
但这令人困惑。那么“暂停”并不能保证主安全。只有方法的实现可以。 ?????? @JuanJoséMeleroGómez 正确,“暂停”本身并不能保证主安全。如果写得不好,挂起乐趣仍然会阻塞 UI 线程。 Roman 在这里明确地谈到了这一点,例如:elizarov.medium.com/…【参考方案3】:请查看此答案,了解 API 调用与改造一起使用而不将调度程序更改为 IO 的确切原因,参考 https://***.com/a/61216333/4354001:
之所以有效,是因为 Retrofit 的暂停实现委托给 呼叫.入队。这意味着它已经在自己的后台执行 默认情况下执行器,而不是使用调用者的 Dispatcher。
【讨论】:
以上是关于Kotlin Coroutines 中的 main-safe 是啥?的主要内容,如果未能解决你的问题,请参考以下文章