Suspend function 'callGetApi' should be called only from a coroutine or another suspend function

前端 未结 3 2272
[愿得一人]
[愿得一人] 2020-12-03 00:50

I am calling suspended function from onCreate(...)

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

相关标签:
3条回答
  • 2020-12-03 01:21

    Looks like the most elegant way to do it as of July 2019, is the one described 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) 
            }
        }
    }
    

    Don't forget to add the correponding lib:

    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha02"
    
    0 讨论(0)
  • 2020-12-03 01:42

    The above answer worked , but i solved it without inheriting CoroutineScope class by just using .... gradle.build

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

    Activity.kt

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

    Dispatchers.Main is important cause you cannot update the UI in any other thread than main.

    But its recommended to inherit CoroutineScope to maintain the lifecycle of the activity and onDestroy of the activity to kill the job

    0 讨论(0)
  • 2020-12-03 01:43

    Suspend function should be called only from coroutine. That means you need to use a coroutine builder, e.g. launch. For example:

    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) {...}
    }
    

    To use Dispatchers.Main in Android add dependency to the app's build.gradle file:

    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
    
    0 讨论(0)
提交回复
热议问题