カテゴリー
Kotlin言語

Android:Kotlin:スレッド処理の基本(Looper と Handler)

Android でスレッド処理を記述する方法はいろいろあります。ここでは Handler クラスを使ったスレッド処理を Kotlin で記述してみます


Looper と Handler

  • Handler は Android が提供するライブラリです(Java が提供する似たようなライブラリに Executor がある)
  • Android アプリでは、別スレッドから直接 UI を操作することができません
  • 別スレッドからアプリの UI を操作するのに Looper と Handler というしくみを使うことができます
  • Looper は UI を管理するスレッドにあらかじめ用意されています。Looper は処理対象のリスト(キュー)を持っていて、そこに登録されたスレッドを繰り返し(ループ)実行します
  • Looper のリスト(キュー)への登録など、Looper とのやりとりは Handler を使って行います

スレッドの作成

  • 別スレッド自体は Runnable を使って作成できます
  • 図にすると次のようになります

別スレッドを扱うコード

  • コードはおおむね次のようになります
  • Handler のオブジェクトを生成するときに、引数を空にしておくのはダメになったようです。必ず対象となる Looper を指定します

val handler = Handler() だとダメなんだそうです

  • アクティビティやフラグメントの中で Looper に関連付けた Handler を生成します。別スレッド(Runnable から作成)はこの Handler で管理します
// Handler のオブジェクトを生成
val handler = Handler(Looper.getMainLooper())

// 別スレッドを Runnable で作成
val runnable = object : Runnable {
    override fun run() {
        ・・・
        handler.postDelayed(this, 1000)
        ・・・
    }
}

// 別スレッドを実行
handler.post(runnable)

// 別スレッドを停止
handler.removeCallbacks(runnable)

この他にも Coroutine(コルーチン)を使う方法など、スレッドを扱う手法はいろいろです