no-image

【Android Studio】JavaのThread.Sleep()で処理がうまくいかないときの対処方法

Android StudioのThread.Sleep()で処理がうまくいかない?

Android StudioのThread.Sleep()には次のような問題があるようです。

まず知っておいてほしいことは、AndroidのUIはシングルスレッドで処理されるということです。
ですから、描画処理もonClick()と同じスレッドで行われます。
(簡単に言うと、onClick()から戻ってきたあと、描画処理が行われるということです。)

Thread.sleepはスレッドの流れを止めてしまうため、6秒後に「3」が出てしまっているわけです。

Java – Java Android Thread sleepに関して(26015)|teratail

JavaのThread.Sleep()以外の待機方法はある?

Javaの待機方法にはいろいろあると思うのですが、筆者が知っている方法を以下に2つ示します。

    1. HandlerクラスのpostDelayed()メソッドを使う方法
    2. Timerクラスschedule()メソッドを使う方法

HandlerクラスのpostDelayd()メソッドを使って待機を行う方法

コードを先に示します。

new Handler.postDelayed(new Runnable(){
public void run(){
//処理
}
}, 待機時間ミリ秒);
ちょっとややこしいかもしれませんが、postDelayed()のパラメーターはRunnableオブジェクトと待機時間(delay)を渡します。数値で指定します。

Timerクラスのschedule()メソッドを使って待機する方法

コードを示します。

new Timer().schedule(new TimerTask(){
public void run(){
//処理
}
}, 待機時間ミリ秒);
schedule()メソッドのパラメーターはTimerTaskのインスタンスと待機時間(delay)です。

解説

postDelayed()とschedule()の違いですが、きちんと解説することはできないのですが、両方とも同じ挙動になるようです。重要なのは、

指定した待機時間後に処理が実行される点です。

そのため複数のことがらを順をおって処理したいときは待機時間(delay)をずらす必要があります。

まとめ

取りとめのない記事になりましたが、少しでも力になれば幸いです。自分と似たような現象に遭遇した方のために参考になりそうなリンクをはっておくので見てみてください。

Java – Java Android Thread sleepに関して(26015)|teratail
android – Listから取り出したボタンを 1秒まってからボタンの色を変えたい。 – スタック・オーバーフロー