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 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Coroutines 的现有 3 函数回调

Kotlin Coroutines 协程实现原理全解析

Kotlin Coroutines不复杂, 我来帮你理一理

Kotlin Coroutines:等待多个线程完成

Kotlin Coroutines 选择 Dispatcher

如何使用 Kotlin Coroutines 在 Retrofit 中处理 204 响应?