Kotlinのdelay関数の使い方を完全ガイド!非同期で遅延処理を実装する方法
生徒
「Kotlinで何秒か待ってから処理をしたいんですが、どうやって遅らせるんですか?」
先生
「Kotlinでは、delayという関数を使うことで、非同期的に処理を遅らせることができますよ。」
生徒
「非同期っていうのは、普通の遅延と違うんですか?」
先生
「その違いも含めて、これからわかりやすく説明していきますね!」
1. delay関数とは?
delay関数は、Kotlinのコルーチンの中で使うことができる非同期の遅延処理です。例えば「3秒待ってから次の処理をする」といった場面で使われます。
非同期とは、「待っている間に別のことができる」ような動きのことです。これに対して、同期処理は「終わるまでじっと待つ」イメージです。
delay関数はThread.sleep()のように完全に止めてしまう処理とは違い、軽く一時停止するような感覚で使えます。
2. delay関数の基本的な使い方
delay関数は、ミリ秒単位(1000ミリ秒 = 1秒)で待ち時間を指定します。基本的な使い方は次の通りです。
import kotlinx.coroutines.*
fun main() = runBlocking {
println("処理1:開始")
delay(2000) // 2秒間待つ
println("処理2:2秒後に実行")
}
このプログラムでは、「処理1」が表示されたあと、2秒間何も表示されずに待ち、その後「処理2」が表示されます。
このようにdelay関数は、コルーチンの中で一時的に待機するために使われます。
3. delayとThread.sleepの違い
Thread.sleep()とdelay()はどちらも「待つ」処理ですが、大きな違いがあります。
- Thread.sleep():完全にスレッドを停止する
- delay():他の処理を邪魔せずに非同期で待つ
たとえば、アプリ全体が止まってほしくないときにはdelayを使うのが最適です。
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
delay(3000)
println("3秒後の処理")
}
println("すぐに表示される処理")
}
このコードでは、「すぐに表示される処理」が先に出て、その3秒後に「3秒後の処理」が出てきます。
4. delayを使うにはrunBlockingが必要?
delayはコルーチンの中でしか使えないので、main関数などで使うときにはrunBlockingで囲む必要があります。
runBlockingとは、「コルーチンを待つ」ための特別な関数です。
import kotlinx.coroutines.*
fun main() = runBlocking {
println("スタート")
delay(1000)
println("1秒後に実行")
}
このように、runBlockingの中でdelayを使うことで、正しく非同期的に待機することができます。
5. delayを複数回使ってみよう
delay関数は複数回使っても問題ありません。順番に遅延処理を入れてみましょう。
import kotlinx.coroutines.*
fun main() = runBlocking {
println("処理A")
delay(1000)
println("処理B")
delay(1000)
println("処理C")
}
このコードでは、1秒ずつ待って順番に処理が実行されていきます。アニメーションのように時間を使って処理を進めたいときに便利です。
6. delayを使った簡単なカウントダウン
delayを使えば、簡単なカウントダウンも実現できます。
import kotlinx.coroutines.*
fun main() = runBlocking {
for (i in 5 downTo 1) {
println("$i...")
delay(1000)
}
println("スタート!")
}
このようにdelayを使えば、時間を使った演出や待機処理も自然に実装できます。
7. delay関数の注意点
delay関数は便利ですが、コルーチンの中でしか使えないという制限があります。通常の関数で使おうとすると、エラーになります。
そのため、delayを使いたいときはrunBlockingやlaunch、asyncなどでコルーチンを作成しましょう。
また、Androidアプリの中では、Dispatchers.Mainなどと組み合わせて使うことが一般的です。
8. delay関数で処理にゆとりを持たせよう
プログラムの中には、すぐに次の処理をせず、少し待ってから動かしたい場面がよくあります。delay関数は、そんな「待つ」という操作をスマートに非同期で行ってくれる便利な機能です。
特に、アニメーションやネットワークアクセスのように「時間がかかる処理」や「少し間をあけたい処理」に使うと、ユーザーにとって快適な動作になります。