Application类android上的协程范围

时间:2020-04-16 17:00:55

标签: 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方法作为“活动”

3 个答案:

答案 0 :(得分:9)

否, GlobalScope 适用于应用程序实例。

如本文here中所述:


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

  • 促进硬编码值。 如果直接使用Dispatchers,可能很容易对GlobalScope进行硬编码。这是一个坏习惯!

  • 这使测试非常困难。 由于您的代码将在不受控制的范围内执行,因此您将无法管理由其执行的工作的执行。

  • 您不能为所有协程拥有共同的CoroutineContext 像我们对applicationScope所做的那样将其内置到范围中。相反,您必须将公用CoroutineContext传递给所有以GlobalScope开头的协程。


因此,解决方案是创建自己的作用域!

val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)

我们不需要取消此范围,因为我们希望它保持有效状态 申请过程仍然有效,因此我们没有对SupervisorJob的引用。 我们可以使用此作用域来运行需要比调用寿命更长的协程 范围可能会在我们的应用中提供。

答案 1 :(得分:1)

GlobalScope 将适用于应用程序实例。taskRepository变量的 get()方法将用作提供者模式。它不应该在应用实例中。可以用 lazy 方法代替。

答案 2 :(得分:1)

您可以使用 onLowMemory() 释放应用程序类上的 CoroutineScope()。 onLowMemory() 类似于 onDestroy()

val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)

清除范围

override fun onLowMemory() {
    super.onLowMemory()
    applicationScope.cancel()
}

onLowMemory 方法释放您可能占用的任何缓存或其他不必要的资源,系统将从该方法返回后为您执行垃圾收集。