为什么使用GlobalScope需要@DelicateCoroutinesApi

Ada*_*kad 23 android kotlin android-studio kotlin-coroutines

我正在使用 Kotlin,现在 android studio 建议我添加

这是一个微妙的 API,使用时需要小心。确保您完全阅读并理解标记为敏感 API 的声明文档。

当我点击

add @DelicateCoroutinesApi annotation to function
Run Code Online (Sandbox Code Playgroud)

它添加了 @DelicateCoroutinesApi 这样的东西

@DelicateCoroutinesApi
fun getAmount(activity: LoginActivity, user:FirebaseUser){
      mFireStore.collection(Constants.AMOUNT).document(user.uid).get().
            addOnSuccessListener { d ->
                 activity.amountGetSuccess( d, user)
            }
 }
Run Code Online (Sandbox Code Playgroud)

当我使用协程时,它建议我看另一个例子

@DelicateCoroutinesApi
 private fun playsound() {

   GlobalScope.launch {
        withTimeout(10L) {
            // play sound
   val  mPlayerPress = MediaPlayer.create(this, R.raw.button_press)
            mPlayerPress.start()
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么这个@DelicateCoroutinesApi @DelicateCoroutinesApi 的工作是什么

mig*_*WOZ 25

@DelicateCoroutinesApi某些 API 使用需要注释,如果您查看文档,它会说明

\n
\n

标记协程中微妙的声明\xe2\x80\x94\n它们的用例有限,在一般代码中应小心使用。任何对微妙声明的使用都必须仔细审查\n以确保它被正确使用并且不会产生\n内存和资源泄漏等问题。仔细阅读标记为 的任何\n声明的文档DelicateCoroutinesApi

\n
\n

使用GlobalScope需要此注释,因为GlobalScope属于“用例有限,应谨慎使用”类别。

\n

这是因为 kotlin 协程遵循结构化并发原则,这意味着新的协程只能在特定的环境中启动CoroutineScope,从而限制了协程的生命周期。例如,如果您使用 启动一个协程viewModelScope,那么该协程将在被销毁后立即取消ViewModel

\n

GlobalScope另一方面创建全局协程,它们的生命周期是程序员的责任,如果由于某种原因(网络延迟等)这些全局协程无法完成,那么它们会继续运行并消耗系统资源,这种行为以及其他问题,可能会导致内存泄漏,因此DelicateCoroutinesApi.

\n