【问题标题】:What is the difference between Dispatchers.Main and Dispatchers.Default in Kotlin coroutines?Kotlin 协程中的 Dispatchers.Main 和 Dispatchers.Default 有什么区别?
【发布时间】:2020-04-26 01:17:23
【问题描述】:

Kotlin 协程中 Dispatchers.Main 和 Dispatchers.Default 有什么区别?

我使用了viewModelScope.launch {},并按预期在 UI 线程上执行了启动块。然后我发现它默认为viewModelScope.launch(Dispatchers.Default) {}。

这让我有点困惑,因为我认为我应该使用 Dispatchers.Main 在 UI 线程上执行操作。

到目前为止,Android 上的 Dispatchers.Default 似乎默认为 Dispatchers.Main。对吗?

如果我使用一种或另一种或它们可以互换,是否有任何缺点?如果它们在 Android 上可以互换,如果将来我将添加对 kotlin 多平台的支持,是否会产生影响?

【问题讨论】:

  • 默认其实是Dispatchers.Main。见here。 This blog post 也这么说。
  • 哦,我现在看到了我的错误,我正在查看错误的文档

标签: android kotlin kotlin-coroutines kotlin-android-extensions


【解决方案1】:

然后我发现它默认为 viewModelScope.launch(Dispatchers.Default) {}。

不,viewModelScope.launch() 默认为 Dispatchers.Main。 Google 会覆盖普通的默认 launch() 调度程序,即 Dispatchers.Default。我建议始终指定调度程序,而不是让人们猜测在什么情况下使用哪个调度程序。

是吗?

不,抱歉。

【讨论】:

  • 我的建议是:一切都应该始终在Main 中启动,这应该是整个项目的理解假设。如果某些特定的代码与阻塞 IO 一起使用,它应该在内部使用 withContext(IO) 作为实现细节。与调度程序混在一起不属于顶级抽象。
  • @MarkoTopolnik 只要它是一个共同的假设......但这一点都不清楚。而且默认到 Main 的覆盖并不是每个人都知道的,所以我同意“总是指定调度程序,而不是让人们猜测在哪种情况下使用哪个调度程序”的说法
  • @Dmitri Main 的默认值实际上是 Android 上最自然的默认值,我认为没有任何混淆的余地,特别是如果您采用不在任何其他调度程序中启动的规则。这意味着协程将在您启动它的同一线程上运行,并且专用调度程序的全部关注将仅限于需要它们的逻辑。
  • @MarkoTopolnik 我的观点是,如果您首先查看 Dispatchers 假定的默认值,那么很自然地会假设这些默认值将在其他地方使用。发布此问题的人是这样认为的,直到最近我通过查看源代码发现不同的默认值时也是如此。而且官方文档也没有提到——developer.android.com/topic/libraries/architecture/coroutines
  • @Dmitri 但该默认值仅在您使用 Android 特定的 CoroutineScope 时适用,例如 MainScope 或 viewModelScope。 Android 实际上并没有覆盖或更改任何全局默认值,它只是定义了一些标准范围。但是,我同意 viewModelScope 上的文档应该对此更加明确,尽管我个人并不怀疑它使用的是哪个调度程序。
猜你喜欢
  • 2022-11-12
  • 2019-11-13
  • 1970-01-01
  • 2017-08-18
  • 2018-12-22
  • 2019-08-19
  • 1970-01-01
  • 2017-06-13
相关资源
最近更新 更多