【Kotlin/Android】Timerクラスの使い方!遅延処理や一定時間毎のループ実装

【Kotlin/Android】Timerクラスの使い方!遅延処理や一定時間毎のループ実装

この記事からわかること

  • Android Studio/KotlinTimerクラス使い方
  • 遅延処理一定時間ごとに処理を実行する方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Timerクラス

公式リファレンス: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型

TimerTaskRunnableを継承しており、実行したい処理を定義するクラスです。runメソッドをオーバーライドして実行したい処理を定義します。


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.

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index