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

标签 android kotlin

我需要在我的 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/

    相关文章:

    parameters - 无法为 Kotlin 中 fun 中的局部变量重新分配 Val 的编译时错误

    Kotlin 从委托(delegate)访问属性名称

    android - 使用 Push() 生成的 Android 删除 Firebase 数据库中的单个项目

    android - 适配器可以用在动态构建代码的布局上吗?

    Android Gradle - 是否可以使用拆分仅用于发布?

    android-studio - Kotlin,如何使用 '$'作为String.format中的参数索引

    java - 不幸的是 MyApp 已停止。我该如何解决这个问题?

    java - Android 5.0 SSL 连接问题

    java - 如何在 Android Studio 中删除 imageView 的边框?

    java - 不幸的是MyApp已停止。我该如何解决?