【问题标题】:GlobalScope.launch is "delicate" - how to deal with?GlobalScope.launch 是“微妙的” - 如何处理?
【发布时间】:2022-01-09 07:01:18
【问题描述】:

我正在更新我的 Kotlin Android 应用以使用 Coroutines 1.5.2(以前使用 1.4.3)。

在 1.5.2 中,GlobalScope.launch 的任何使用现在都被标记为“微妙”:

https://blog.jetbrains.com/kotlin/2021/05/kotlin-coroutines-1-5-0-released/#globalscope

假设我知道自己在做什么(在某些情况下,我需要一个不会随包含的活动/片段消失的范围)。

如何标记这些用途,以免它们被标记?建议使用以下选项,但似乎没有一个很好。

选项 1 - 将 @DecliateCoroutinesApi 添加到方法中。这使得该方法也“微妙”,并且任何对 的调用现在都会得到检查,因此什么也得不到。

选项 2 - 将 @DecliateCoroutinesApi 添加到班级。看起来有点矫枉过正。

选项 3 - 将 @OptIn(DelicateCoroutinesApi::class) 添加到方法中。几乎不错,但需要一个特殊的编译器开关-Xopt-in=kotlin.RequiresOptIn。有点乱。

有什么建议吗?

【问题讨论】:

  • 选项#4:创建您自己的CoroutineScope,拥有您想要的生命周期,然后使用它。

标签: android kotlin-coroutines


【解决方案1】:

如果您真的知道自己在做什么,那么选项 3 应该是可行的方法。 @OptIn 确实是实验性的,但编译器标志通常是通过 @OptIn 使用实验性功能所付出的小代价。您也可以不使用编译器标志,并保留有关 @OptIn 注释本身的警告,但这在 IMO 中更加混乱。

也就是说,您在使用GlobalScope 时真的应该三思而后行。大多数情况下,您可以改为创建一个您自己控制的范围(使用调度程序,也可能使用 Job/SupervisorJob,因此您可以在适当的时候取消协程)。

【讨论】:

  • 是的,我也在考虑创建 MyGlobalScope,里面有一个 Job。甚至不需要取消,这是用于短暂的异步任务,例如在 Fragment / Activity 被销毁时保存数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多