Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. delay() / withTimeout()

delay() / withTimeout()

Kotlinコルーチンの『delay()』はスレッドをブロックせずに指定時間だけ処理を中断します。『withTimeout()』は制限時間内に完了しない場合に例外を発生させます。

構文
// delay — 指定ミリ秒だけコルーチンを中断
delay(ミリ秒: Long)

// withTimeout — タイムアウト付き実行(超過で例外)
val result = withTimeout(ミリ秒: Long) {
    // 処理
    結果
}

// withTimeoutOrNull — タイムアウト時に null を返す
val result: 型? = withTimeoutOrNull(ミリ秒: Long) {
    // 処理
    結果
}
関数一覧
関数概要
delay(ms)指定ミリ秒だけコルーチンを中断します(スレッドはブロックしません)。
withTimeout(ms) { }時間内に完了しない場合は『TimeoutCancellationException』を投げます。
withTimeoutOrNull(ms) { }タイムアウト時に例外でなく null を返します。
サンプルコード
import kotlinx.coroutines.*

suspend fun slowOperation(): String {
    delay(500)  // 0.5秒かかる処理を模倣
    return "完了"
}

fun main() = runBlocking {
    // delay で待機します(Thread.sleep と異なりスレッドをブロックしません)。
    println("開始")
    delay(200)
    println("200ms後")  // 200ms後

    // withTimeout でタイムアウトを設定します。
    try {
        val result = withTimeout(1000) {
            slowOperation()  // 500ms で完了(タイムアウト内)
        }
        println(result)  // 完了
    } catch (e: TimeoutCancellationException) {
        println("タイムアウト!")
    }

    // withTimeoutOrNull はタイムアウト時に null を返します。
    val result1 = withTimeoutOrNull(1000) {
        slowOperation()  // 500ms(間に合う)
    }
    println(result1)  // 完了

    val result2 = withTimeoutOrNull(300) {
        slowOperation()  // 500ms(タイムアウト)
    }
    println(result2)  // null

    // null チェックで処理を分岐します。
    if (result2 == null) {
        println("時間内に完了しませんでした")  // 時間内に完了しませんでした
    }
}
概要

『delay()』はコルーチンを一時停止するだけでスレッドを占有しないため、同じスレッドで別のコルーチンを実行できます。『Thread.sleep()』の代わりに使います。

タイムアウト処理には例外キャッチが必要な『withTimeout()』よりも、戻り値で判定できる『withTimeoutOrNull()』が扱いやすい場面が多いです。

コルーチンの起動はlaunch / asyncを、非同期データストリームはFlow — 基本を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。