代码之家  ›  专栏  ›  技术社区  ›  Santanu Sur

挂起函数“callGetApi”只能从协同程序或其他挂起函数调用

  •  0
  • Santanu Sur  · 技术社区  · 6 年前

    我正在从onCreate()调用挂起的函数

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        ...
        callGetApi()
    }
    

    暂停的功能是:-

    suspend fun callGetApi() {....}
    

    但是错误出现了

    2 回复  |  直到 6 年前
        1
  •  46
  •   Sergio    5 年前

    应仅从协同程序调用挂起函数。这意味着您需要使用协同程序生成器,例如。 launch . 例如:

    class Activity : AppCompatActivity(), CoroutineScope {
        private var job: Job = Job()
    
        override val coroutineContext: CoroutineContext
            get() = Dispatchers.Main + job
    
        override fun onDestroy() {
            super.onDestroy()
            job.cancel()
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            launch {
                val result =  callGetApi()
                onResult(result) // onResult is called on the main thread
            }
        }
    
        suspend fun callGetApi(): String {...}
    
        fun onResult(result: String) {...}
    }
    

    使用 Dispatchers.Main build.gradle 文件:

    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
    
        2
  •  30
  •   hannes ach    6 年前

    看起来是最优雅的方式了 2019年7月 ,是所描述的 here :

    import androidx.lifecycle.lifecycleScope
    import kotlinx.coroutines.launch
    
    class Activity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super...
    
            lifecycleScope.launch {
                val result =  callGetApi()
                onResult(result) 
            }
        }
    }
    

    不要忘记添加相应的库:

    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha02"
    
        3
  •  9
  •   Santanu Sur    5 年前

    CoroutineScope 只需使用。。。。 格拉德尔·邦德

      dependencies {
          implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3'
      }
    

      import kotlinx.coroutines.GlobalScope
      import kotlinx.coroutines.Dispatchers
    
      GlobalScope.launch (Dispatchers.Main) { callGetApi() }
    

    Dispatchers.Main 这很重要,因为您无法在除main之外的任何其他线程中更新UI。

    但建议继承CoroutineScope以维护活动和服务的生命周期 onDestroy 终止作业的活动的名称