作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在与 Activity 生命周期无关的库类中正确使用协程?
现在,我在我的类(class)中创建了一个私有(private)属性:
private val coroutineScope = CoroutineScope(Dispatchers.Main)
并有一个取消方法,用于取消范围。
public fun cancel() {
coroutineScope.coroutineContext.cancelChildren()
}
有没有更简洁的方法来完成这项工作,而不必在 onPause/OnStop 中调用取消我的库类?
编辑:
另外,还有一个问题:如果我创建的 CoroutineContext 位于 Singleton 中,这有关系吗?像这样:
public object MyObject {
private val coroutineScope = CoroutineScope(Dispatchers.Main)
}
是否存在内存泄漏或类似的危险?
最佳答案
简单地说不,您在需要时创建一个范围,在不再需要时取消它。范围负责所有协程的生命周期从中被解雇。协程是可挂起计算的一个实例。一旦您不再需要该计算,您可以取消它,以便在真正需要的地方节省计算能力。为了避免通过工作跟踪所有被解雇的协程,我们有一个范围。想象一下,有 1000 个独立的协程,并且必须跟踪 1000 个作业才能取消它们,取而代之的是,我们有一个范围可以一次取消它们。您只需调用scope.cancel()
即可。
避免在 onPause/onStop
中手动调用 cancel()
的一种方法是使用观察模式,让您的库类实现 LifecycleObserver
> 接口(interface)并让它观察感兴趣的Activity/Fragment
的Lifecycle
。
单例只是一个类的单个现有实例,没有理由在其中包含 CoroutineScope
实例会出现任何问题。
关于android - 如何在 Kotlin 库中使用协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68727525/
我是一名优秀的程序员,十分优秀!