web-dev-qa-db-ja.com

中断関数「callGetApi」は、コルーチンまたは別の中断関数からのみ呼び出す必要があります

OnCreate(...)から中断された関数を呼び出しています

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

中断された機能は次のとおりです。

suspend fun callGetApi() {....}

しかし、エラーが表示されますサスペンド関数「callGetApi」はコルーチンまたは別のサスペンド関数からのみ呼び出す必要があります

10
Santanu Sur

サスペンド関数は、コルーチンからのみ呼び出す必要があります。つまり、コルーチンビルダーを使用する必要があります。 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: ...) {}
}

AndroidアプリのDispatchers.Mainファイルに依存関係を追加する]でbuild.gradleを使用するには:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-Android:1.0.1'
11
Sergey

上記の答えはうまくいきましたが、...を使用するだけで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は、main以外のスレッドでUIを更新できないため、重要です。

ただし、アクティビティのライフサイクルとジョブを強制終了するアクティビティのonDestroyを維持するためにCoroutineScopeを継承することをお勧めします

5
Santanu Sur

2019年7月の時点で最もエレガントな方法のように見えますが、説明されているものは ここ

import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch

class Activity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super...

        lifecycleScope.launch {
            val result =  callGetApi()
            onResult(result) 
        }
    }
}

対応するlobを追加することを忘れないでください:

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-alpha02"
1
Kipr