Handler()が非推奨との警告に対する解決方法
'constructor Handler()' is deprecated. Deprecated in Java
ヒーラー
スプラッシュ画面などHandler().postDelayed()で数秒遅らせる処理で警告が出るようになった
問題
警告の内容は以下のとおりです。
'constructor Handler()' is deprecated. Deprecated in Java
具体的には、MainActivityにおいて、初期起動時にスプラッシュ画面を数秒表示させる処理で、Handlerを使用しており、非推奨になったことがわかりました。
val splashView = findViewById<ConstraintLayout>(R.id.splash)
Handler().postDelayed(Runnable {
splashView.visibility = View.GONE
}, 2000)
解決方法
結論としては、以下の対応で解決しました。
val splashView = findViewById<ConstraintLayout>(R.id.splash)
Handler(Looper.getMainLooper()).postDelayed({
splashView.visibility = View.GONE
}, 2000)
Handlerの使用自体は問題ではなく、コンストラクタの使い方を変更することで解決しました。
解説
警告に書かれている内容のとおりですが、Handler()の引数なしのコンスタクタを使用すると、デフォルトで暗黙的Looperが選択され、予期せず終了(クラッシュ)する恐れがあるということです。
Looperとは内部にキューを持ち、キューから取り出した命令を順番に処理する仕組みをいいます。このLooperはスレッド毎にあり、例えばUIを処理するようなメインスレッドにはメインスレッド用のメインルーパーがあって、順次画面に関する処理がされていると考えれば良さそうです。
つまり、Handlerが意図せずアクティブではないスレッドで作成されてクラッシュしてしまうことなどを回避するために、Handlerのコンストラクタで、属するLooperを明示的に指定する必要があるということです。