web-dev-qa-db-ja.com

Kotlinのsuspendキーワードはいつ使用しますか?

fun startAsyncFunc() {
  launch {
    asyncFunc1()
    asyncFunc2()
  }
}

fun asyncFunc1() { ... }
suspend fun asyncFunc2() { ... }

suspendなしで作業を終了でき、テストも簡単になります(runBlockingを追加せずにテストできます。

私の質問:

  1. asyncFunc1 vs asyncFunc2、どちらが優れているのか、そしてその理由は?
  2. asyncFunc2の方が優れている場合、コルーチンで関数を実行するときは常にsuspendを使用する必要がありますか?

更新

Kotlin Coroutinesの最近のリリースでは、メソッドにコルーチンコード(launchasyncなど)が含まれていない場合、コンパイラーがThis inspection reports a suspend modifier as redundant if no other suspend functions are called insideと文句を言います。したがって、suspendは必須の場合にのみ使用する必要があると思います。

Update2

グーグルからのアドバイス

7
Dewey Reed

docs から:

一時停止関数は、通常の関数と同じようにコルーチン内で使用できますが、追加の機能として、この例の遅延などの他の一時停止関数を使用して、コルーチンの実行を一時停止できます。

1
William Reed

次の場合にsuspendキーワードを使用します。

  • 何らかの方法で遅延する関数(いくつかの計算、ネットワーク要求を待機中)

    • 関数が他のサスペンド関数を呼び出すときはいつでも
    • withContext()を呼び出す関数– withContext()は、コルーチンライブラリからのサスペンド関数です。

経験則では、強制されない限り、機能の一時停止をマークしないでください。

0
Fanadez