質問: 0; i < 5; i++){ try{ Thread.sleep(1000); } catch(InterruptedException e){ } x++; tv.setText("x は" + x); } } }); } ``` このプログラムを実行すると b 5秒後 xは5 と表示されました。 b 1秒後 xは1 1秒後 xは2 と「xは5」まで表示されると思ったのですが、b→5秒後→xは5と表示されたのはどうしてなのでしょうか? ここではfor文が使えない仕様になっているのでしょうか?
回答: 実際にためしてみました。 まず、HandlerとThreadは違うものです。 で、RunnableはHandlerに積む(postする)ことができる部品みたいなものと思って下さい。 forループ等の処理をUIスレッド以外で実行する場合、たとえば以下のようにThreadをnewしてください。 ``` @Override public void run(){ new Thread(new Runnable() { @Override public void run() { for(int i = 0; i < 5; i++){ try{ Thread.sleep(1000); } catch(InterruptedException e){ } x++; tv.setText("x は" + x); } } }).start(); } ``` ただ、実行していただくとわかりますが、このrunは例外(CalledFromWrongThreadException)で落ちます。 原因はUIスレッド以外で画面の更新を行おうとしているからです。 そのため、UIスレッド以外での画面更新は例えば「RunnableをHandlerにpostする」といった具合に実装します。 いろいろ方法はあるとおもいますが、とりあえずご希望に沿うようにするとしたら、このようになります。 ``` @Override public void run(){ new Thread(new Runnable() { @Override public void run() { for(int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { } x++; mHandler.post(new Runnable() { @Override public void run() { tv.setText("x は"+x); } }); } } }).start(); } ``` 書いたのは私ですがこのソースは非常に汚いです。 「android Handler Thread 違い」等で検索していただくと、より参考になる情報があるかもしれません。