【Kotlin/Android】Timerクラスの使い方!遅延処理や一定時間毎のループ実装
この記事からわかること
- Android Studio/KotlinのTimerクラスの使い方
- 遅延処理や一定時間ごとに処理を実行する方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
Timerクラス
AndroidのTimer
クラスはタイマーを使用してバックグラウンドでタスクを操作するための機能を提供するクラスです。指定したタスク(処理)を特定の秒数後に遅延させたり、一定の間隔で都度タスク(処理)を実行することができるようになります。
各TimerオブジェクトにはそのTimerに紐づくすべてのタスクを順番に実行するためのバックグラウンドスレッドを1つ用意します。Timerオブジェクトへの最後の参照がなくなり、すべてのタスクが実行を完了すると、Timerのタスク実行スレッドは終了し、ガベージコレクションの対象になります。
Timerのタスク実行スレッドをすぐに終了させたい場合は、cancel
メソッドを呼び出せばOKです。
scheduleメソッド
Timer
を使用するにはschedule
メソッドを使用します。引数に実行したい処理や遅延秒数などを渡します。
public void schedule(TimerTask task, long delay, long period) {
throw new RuntimeException("Stub!");
}
- TimerTask task:処理
- long delay:遅延したいミリ秒数
- long period:繰り返し実行したい間隔ミリ秒数
TimerTask型
TimerTask
はRunnable
を継承しており、実行したい処理を定義するクラスです。run
メソッドをオーバーライドして実行したい処理を定義します。
おすすめ記事:Runnableオブジェクトとは?
public abstract class TimerTask implements Runnable {
protected TimerTask() {
throw new RuntimeException("Stub!");
}
public abstract void run();
public boolean cancel() {
throw new RuntimeException("Stub!");
}
public long scheduledExecutionTime() {
throw new RuntimeException("Stub!");
}
}
使い方
Timer
クラスを使用して「1秒遅延して1秒ごとに処理を実行する」処理を実装するには以下のようになります。run
メソッド内はバックグラウンドスレッドになるのでUI操作を行いたい場合はHandler
などを使用して明示的にUIスレッドに変更して使用します。
class MainActivity : AppCompatActivity() {
private val timer = Timer()
private val handler = Handler(Looper.getMainLooper())
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// タスクを定義
val task = object : TimerTask() {
override fun run() {
// バックグラウンド操作
Log.d("Timer", Thread.currentThread().getName()) // Timer-0
handler.post {
// UI操作
Log.d("Timer", Thread.currentThread().getName()) // main
}
}
}
// 1秒遅延して1秒ごとに処理を実行する
timer.schedule(task, 1000, 1000)
}
override fun onDestroy() {
super.onDestroy()
// タイマーをキャンセル
timer.cancel()
}
}
Timerは再利用できない
Timer
は一度cancel
メソッドを呼び出すと同じTimer
インスタンスからschedule
メソッドを再度呼び出すことはできません。
呼び出そうとするとjava.lang.IllegalStateException
エラーを吐きます。そのため再度スケジュールしたい場合は新しいTimer
インスタンスを生成して使用する必要があります。
val timer = Timer()
val task = object : TimerTask() {
override fun run() {
println("Timer task executed at: ${System.currentTimeMillis()}")
}
}
timer.schedule(task, 500, 1000)
// タイマーをキャンセル
timer.cancel()
// 同じインスタンスで再度スケジュールを試みるとエラー
timer.schedule(task, 500, 1000) // java.lang.IllegalStateException: Timer already cancelled.
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。