我需要在我的 android 上引用协程范围Application。我做了以下
class TodoApplication : Application() {
private var job = Job()
private val applicationScope = CoroutineScope(Dispatchers.Main + job)
val tasksRepository: TasksRepository
get() = ServiceLocator.provideTasksRepository(this, applicationScope)
}
Run Code Online (Sandbox Code Playgroud)
这是这样做的方法吗。如果是这样,我如何取消在此范围内启动的协程job.cancel()
应用程序类没有 onDestroy 方法作为活动
小智 28
不,GlobalScope将不适合 Application 实例。
由于这里提到的这篇文章在这里:
不应该使用 GlobalScope 的原因有很多:
促进硬编码值。Dispatchers如果您GlobalScope直接使用
,硬编码可能很诱人。这是一个不好的做法!
它使测试变得非常困难。 由于您的代码将在不受控制的范围内执行,您将无法管理由它启动的工作的执行。
您不能
像我们对applicationScope. 相反,您必须CoroutineContext向所有以GlobalScope.
因此,对此的解决方案是创建您自己的范围!!
val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
Run Code Online (Sandbox Code Playgroud)
我们不需要取消这个作用域,因为我们希望它在应用程序进程还活着的时候一直保持活动状态,所以我们不持有对 SupervisorJob 的引用。我们可以使用这个作用域来运行需要比调用作用域在我们的应用程序中提供的生命周期更长的协程。
根据现有的答案,我想出了这个解决方案:
\nclass YourApplication : Application() {\n\n companion object {\n var applicationScope = MainScope()\n }\n \n override fun onLowMemory() {\n super.onLowMemory()\n applicationScope.cancel("onLowMemory() called by system")\n applicationScope = MainScope()\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nonLowMemory() 部分在某种程度上是可选的,但似乎是个好主意,因为未完成的作业可能会在应用程序的整个生命周期中保留在那里并使用系统资源。
\n我们不需要取消此范围,因为onDestroy我们希望只要应用程序进程处于活动状态,它就保持活动状态,如已接受的答案中所述。
另一种解决方案可能是使用lifecycleScopeof ProcessLifecycleOwner:
class YourApplication : Application() {
...
override fun onCreate() {
super.onCreate()
with(ProcessLifecycleOwner.get()) {
lifecycle.addObserver(yourProcessLifeCycleObserver)
lifecycleScope.launch { TODO("Do some work here.") }
}
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
在此处检查必要的依赖项。
| 归档时间: |
|
| 查看次数: |
4747 次 |
| 最近记录: |