OnCreate(...)から中断された関数を呼び出しています
override fun onCreate(savedInstanceState: Bundle?) {
...
...
callGetApi()
}
中断された機能は次のとおりです。
suspend fun callGetApi() {....}
しかし、エラーが表示されますサスペンド関数「callGetApi」はコルーチンまたは別のサスペンド関数からのみ呼び出す必要があります
サスペンド関数は、コルーチンからのみ呼び出す必要があります。つまり、コルーチンビルダーを使用する必要があります。 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'
上記の答えはうまくいきましたが、...を使用するだけで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を継承することをお勧めします
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"