【问题标题】: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 调用这些挂起函数是安全的,即使它们从网络获取并写入数据库。

【问题讨论】:

    标签: kotlin kotlin-coroutines


    【解决方案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://stackoverflow.com/a/61216333/4354001

      之所以有效,是因为 Retrofit 的暂停实现委托给 呼叫.入队。这意味着它已经在自己的后台执行 默认情况下执行器,而不是使用调用者的 Dispatcher。

      【讨论】:

        猜你喜欢
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        • 2021-03-20
        • 2019-11-28
        • 2011-09-24
        • 1970-01-01
        相关资源
        最近更新 更多