我需要在我的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方法作为“活动”
答案 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 方法释放您可能占用的任何缓存或其他不必要的资源,系统将从该方法返回后为您执行垃圾收集。