我需要在我的 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
马上。这是一个不好的做法!由于您的代码将在不受控制的范围内执行,因此您将无法管理由它启动的工作的执行。
正如我们对
applicationScope
所做的那样,内置在范围中.相反,您必须传递一个常见的 CoroutineContext
致GlobalScope
开始的所有协程.因此,一种解决方案是创建自己的范围,如下所示:
val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
但更好的是 ,正如@Raman 在评论中指出的那样,使用您已经可用的等效项:kotlinx.coroutines.MainScope()
我们不需要取消这个范围,因为我们希望它保持 Activity 状态,只要申请进程是 Activity 的,所以我们没有对 SupervisorJob 的引用。
我们可以使用这个范围来运行需要比调用更长生命周期的协程
范围可能会在我们的应用程序中提供。
关于android - 应用程序类android上的协程范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61255807/