我正在使用Kotlin,现在android工作室建议我添加
这是一个微妙的API,它的使用需要小心。确保您完全阅读并理解声明的文档,该声明被标记为微妙的API。
当我点击
add @DelicateCoroutinesApi annotation to function
它添加了类似于以下内容的@DelicateCoroutinesApi
@DelicateCoroutinesApi
fun getAmount(activity: LoginActivity, user:FirebaseUser){
mFireStore.collection(Constants.AMOUNT).document(user.uid).get().
addOnSuccessListener { d ->
activity.amountGetSuccess( d, user)
}
}
当我使用coroutine时,它建议我再看看另一个例子
@DelicateCoroutinesApi
private fun playsound() {
GlobalScope.launch {
withTimeout(10L) {
// play sound
val mPlayerPress = MediaPlayer.create(this, R.raw.button_press)
mPlayerPress.start()
}
}
我的问题是为什么这个@DelicateCoroutinesApi @DelicateCoroutinesApi的工作是什么?
发布于 2021-07-31 05:47:10
@DelicateCoroutinesApi
注释对于某些API使用是必需的,如果您查看它所述的文档
标记协同中的声明,这些声明是、微妙的-,它们有有限的用例,在一般代码中应该谨慎使用。任何微妙声明的使用都必须仔细检查,以确保它被正确使用,并且不会造成内存和资源泄漏等问题。仔细阅读任何标记为
DelicateCoroutinesApi
的声明的文档。
GlobalScope
的使用需要这样的注释,因为GlobalScope
落入了“https://elizarov.medium.com/the-reason-to-avoid-globalscope-835337445abc”中。
这是因为kotlin协同器遵循结构化并发的原则,这意味着只有在特定的CoroutineScope
中才能启动新的协同线,该CoroutineScope
确定了coroutine的生存期。例如,如果您使用viewModelScope
启动协同线,则一旦ViewModel
被销毁,该协同线将被取消。
但是另一方面,GlobalScope
创建全局路径,它们的生命周期是程序员的责任,如果由于某种原因(网络延迟等)这些全局协同无法完成,那么它们就会继续运行和消耗系统资源,这种行为连同其他问题会导致内存泄漏,从而导致DelicateCoroutinesApi
。
https://stackoverflow.com/questions/68599452
复制相似问题