Функция приостановки callGetApi должна вызываться только из сопрограммы или другой функции приостановки - PullRequest
0 голосов
/ 26 декабря 2018

Я вызываю приостановленную функцию из onCreate (...)

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

, а приостановленная функция: -

suspend fun callGetApi() {....}

Но появляется ошибка Функция приостановки'callGetApi' должен вызываться только из сопрограммы или другой функции приостановки

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Приведенный выше ответ сработал, но я решил его, не унаследовав CoroutineScope класс, просто используя .... gradle.build

  dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0-M2")
  }

Activity.kt

  import kotlinx.coroutines.GlobalScope
  import kotlinx.coroutines.Dispatchers

  GlobalScope.launch (Dispatchers.Main) { callGetApi() }

Dispatchers.Main имеет важное значение, так как вы не можете обновить пользовательский интерфейс в каком-либо другом потоке, кроме основного.

Но рекомендуется наследовать CoroutineScope для поддержки жизненного цикла действия и onDestroy издеятельность, чтобы убить работу

0 голосов
/ 24 июля 2019

Похоже, самый элегантный способ сделать это с июля 2019 , это описанный здесь :

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"
0 голосов
/ 26 декабря 2018

Функция приостановки должна вызываться только из сопрограммы.Это означает, что вам нужно использовать конструктор сопрограмм, например 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?) {
        launch {
            val result =  callGetApi()
            onResult(result) // onResult is called on the main thread
        }
    }

    fun onResult(result: ...) {}
}

Чтобы использовать Dispatchers.Main в Android, добавьте зависимость в файл build.gradle приложения:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
...