KotlinのwithTimeoutでタイムアウト処理を設定しよう!初心者にもわかる非同期の安全な止め方
生徒
「Kotlinで時間がかかりすぎる処理を途中で止めるにはどうしたらいいですか?」
先生
「そんなときにはwithTimeoutという関数を使って、一定時間内に終わらなければ処理を自動でキャンセルできますよ。」
生徒
「それ便利そうですね!初心者でも使えるように教えてください!」
先生
「もちろんです。非同期処理のタイムアウトについて、やさしく解説していきましょう!」
1. withTimeoutとは?
withTimeoutは、Kotlinのコルーチンで指定した時間内に処理が終わらなければ、自動的にキャンセルして例外を出すための関数です。
たとえば、通信処理やファイルの読み込みなど、時間がかかる可能性がある処理にタイムアウトを設けることで、アプリのフリーズを防ぐことができます。
2. withTimeoutの基本的な使い方
それでは、実際に使ってみましょう。次のサンプルコードでは、3000ミリ秒(3秒)以内に処理が終わらなければタイムアウトになります。
import kotlinx.coroutines.*
fun main() = runBlocking {
try {
withTimeout(3000) {
repeat(5) { i ->
println("処理中... $i")
delay(1000)
}
}
println("正常に完了しました")
} catch (e: TimeoutCancellationException) {
println("タイムアウトでキャンセルされました")
}
}
3. 実行結果の確認
処理中... 0
処理中... 1
処理中... 2
タイムアウトでキャンセルされました
処理は5回繰り返す予定でしたが、delay(1000)で1秒ずつ待っているので、3回目の途中でwithTimeoutにより中断されました。
4. TimeoutCancellationExceptionとは?
TimeoutCancellationExceptionとは、withTimeoutの中で時間をオーバーしたときに投げられる特別なエラー(例外)です。
この例外をキャッチ(捕まえる)することで、タイムアウト時に別の処理をしたり、ユーザーに「時間切れ」と伝えることができます。
5. withTimeoutOrNullとの違い
withTimeoutに似た関数でwithTimeoutOrNullというものもあります。
違いは、タイムアウト時に例外を出さずにnullを返すという点です。
fun main() = runBlocking {
val result = withTimeoutOrNull(3000) {
repeat(5) {
println("処理中...")
delay(1000)
}
"完了!"
}
if (result == null) {
println("時間切れです")
} else {
println("結果: $result")
}
}
6. 実行結果の確認
処理中...
処理中...
処理中...
時間切れです
例外を使わず、nullで判定したい場合にはこちらが便利です。
7. タイムアウト処理が必要な場面
以下のような処理にはwithTimeoutやwithTimeoutOrNullが有効です:
- インターネット通信(APIなど)
- 大きなファイルの読み書き
- 時間のかかる計算処理
- ユーザーの操作待ち
こうした処理が止まったままだと、アプリ全体がフリーズしたように見えることもあります。安全にキャンセルできる仕組みが重要です。
8. キャンセルされた処理はどうなる?
withTimeoutによってキャンセルされた処理は、すぐに止まります。ただし、後片付け(クリーンアップ)が必要な場合は、finallyブロックを使うとよいでしょう。
fun main() = runBlocking {
try {
withTimeout(2000) {
try {
repeat(10) {
println("作業中...")
delay(500)
}
} finally {
println("後片付け中...")
}
}
} catch (e: TimeoutCancellationException) {
println("時間切れで終了しました")
}
}
このようにfinallyの中に書いておけば、タイムアウト後でも確実に実行されます。
Kotlinを基礎からしっかり学びたい人や、 Java経験を活かしてモダンな言語にステップアップしたい人には、 定番の入門書がこちらです。
基礎からわかるKotlinをAmazonで見る※ Amazon広告リンク
9. 初心者でも使えるタイムアウトのポイント
withTimeoutで処理時間の上限を設定TimeoutCancellationExceptionをtry-catchで捕まえるwithTimeoutOrNullでnull判定も可能finallyで安全に後処理ができる
KotlinのwithTimeoutは、非同期処理にタイムアウト機能を組み込むためのとても便利な関数です。アプリが固まったり、動き続けることを防ぐためにも、初心者のうちから使い方を覚えておくと安心です。
【未経験OK】Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験する60分
「プログラミングを始めたい」を形にする。最新言語Kotlinで楽しむ、ものづくりの第一歩。
本講座は、プログラミング経験が全くない方のためのエントリー講座です。「コードを書くってどういうこと?」という基本から、世界中で使われている最新言語Kotlin(コトリン)を使って、実際にプログラムを動かすまでを体験します。難しい理屈よりも、まずは「自分の手で動かす楽しさ」を最短距離で実感していただきます。
具体的な体験内容と環境
【つくるもの】
簡単な言葉を入力すると自動で返答してくれる「対話型ミニプログラム」や、計算を自動化する「便利ツール」をゼロから作成します。黒い画面に自分の書いた文字が表示される瞬間は、最高の感動体験です。
【開発環境】
プロのエンジニアが実際に使っている開発ツールIntelliJ IDEA(インテリジェイ)をインストールします。ボタン一つで日本語化し、初心者でも迷わず操作できる「魔法の設定」を一緒に行います。
この60分で得られる3つの体験
プロと同じ道具を揃えることで、明日から一人でもプログラミングを続けられる環境が整います。
「変数」や「型」といった難しい言葉も、身近な例え話で解説。モヤモヤをゼロにします。
Kotlinは英語に近くて読みやすいのが特徴。自分でコードを読んで、間違いを見つけるコツも伝授します。
※本講座は、パソコン操作が不安な方でも安心して受講いただける完全マンツーマンです。あなたのペースに合わせて、一つずつ丁寧に進めていきます。
Kotlinで始めるプログラミング入門|ゼロから「動く喜び」を体験