gpt4 book ai didi

android - 应用程序类android上的协程范围

转载 作者:行者123 更新时间:2023-12-02 12:05:06 26 4
gpt4 key购买 nike

我需要在我的 android Application 上引用协程范围.我做了以下

class TodoApplication : Application() {
private var job = Job()
private val applicationScope = CoroutineScope(Dispatchers.Main + job)

val tasksRepository: TasksRepository
get() = ServiceLocator.provideTasksRepository(this, applicationScope)

}

这是做它的方法吗。如果是这样,我如何取消在此范围内启动的协程 job.cancel()
应用程序类没有 onDestroy 方法作为 Activity

最佳答案

没有,全局范围 不是 适用于Application实例。
正如本文中提到的 here :

不应该使用 GlobalScope 的原因有很多:

  • 促进硬编码值。
    硬编码 Dispatchers 可能很诱人如果您使用 GlobalScope马上。这是一个不好的做法!
  • 它使测试变得非常困难。
    由于您的代码将在不受控制的范围内执行,因此您将无法管理由它启动的工作的执行。
  • 你不能为所有协程拥有一个共同的 CoroutineContext
    正如我们对 applicationScope 所做的那样,内置在范围中.相反,您必须传递一个常见的 CoroutineContextGlobalScope 开始的所有协程.

  • 因此,一种解决方案是创建自己的范围,如下所示: val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) 但更好的是 ,正如@Raman 在评论中指出的那样,使用您已经可用的等效项:
    kotlinx.coroutines.MainScope()
    我们不需要取消这个范围,因为我们希望它保持 Activity 状态,只要
    申请进程是 Activity 的,所以我们没有对 SupervisorJob 的引用。
    我们可以使用这个范围来运行需要比调用更长生命周期的协程
    范围可能会在我们的应用程序中提供。

    关于android - 应用程序类android上的协程范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61255807/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com