LoginSignup
8

More than 1 year has passed since last update.

posted at

[Android]Handlerの非推奨の解決策&ちょっと理論的な事も

非推奨になっちゃうやーつ

const val DELAY_TIME = 1000

fun delayDelay() {
     Handler().postDelayed({
             // 遅延させたい処理
          }, DELAY_TIME)
}

正しくは

Handler((Looper.getMainLooper())

Handlerの引数を指定してあげてください。

なんで?

ついでに、Handlerについて理論的な事を少しだけ喋ります。

登場人物が多いですが、こう例えてください。
Handler =「トラック」
Message Runnable =「荷物」
Looper =「工場」
Queue =「先入れ先出し」
Message Queue =「ベルトコンベアー」

Androidのメインスレッド(UIスレッドと同じ)には、工場(Looper)が元々あります。
そして、工場内にはMessage Queueという「ベルトコンベアー」があります。
ベルトコンベアーは、Queue「先入れ先出し」方式でMessage、Runnable「荷物」を管理しています。
先入れ先出しとは、先に入れたものが先に出るということで、コンビニとかスーパーでバイトしたことある人は分かるかなと。

そして、ベルトコンベアの先はトラック「Handler」です。
このHandlerが荷物(Message)を処理してくれます。

またHandlerは、他の工場(スレッド)から荷物(Message,Runnable)を受け取り、ベルトコンベアー(Message Queue)に流す役割もあります。

よく見るpostとpostDelayは、ベルトコンベアーに荷物を送る作業なんです。

と、ここでHandlerの引数の話に戻します。
引数を指定しないと、暗黙的にLooperが指定されてしまいます。

メインスレッドには、メインスレッド用の工場があります。
Androidは、UI操作をメインスレッドでしか担えないのはご存じかと思います。

つまり、暗黙的なLooperの指定は場合よってはクラッシュのもとになるので、明示的にLooperを指定してあげないといけないよ!

という意味での非推奨だったのです。

image.png
注)エンジニアに絵心を求めてはいけない

終わり

Handlerについてもっと深く掘り下げたかったのですが、まだ理解が足りなかったようで、これくらいにしておきます。
ただ、この工場の比喩を元に考えたり、実際に実装したり、比喩の整合性を整えたりすると理解するのは時間の問題かなと思いました。

工場長は、いつでもツッコミお待ちしております^^
キューではなく、スタックでお受けします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8