androidでのUIとHandlerについて
SurfaceViewなどで、スレッドを作って、処理ついでにUIの項目(TextViewなど)を更新しようとしたときに、普通にやると
CalledFromWrongThreadException
というエラーが出てしまう。
AndroidアプリのUIはシングル・スレッド モデルで、スレッドからUIを操作しようとすると例外が発生してしまうのです。
悪い例
while (thread != null) { Canvas canv = holder.lockCanvas(); /* * TextViewに「roop」をセットする * ※ここで例外が発生する */ showTime.setText("roop"); canv.drawColor(Color.BLUE); Paint a = new Paint(); a.setColor(Color.BLACK); a.setTextSize(20); canv.drawText("test", 10, 20, a); holder.unlockCanvasAndPost(canv); try { Thread.sleep(100); Thread.yield(); } catch (Exception e) { } }
この問題を回避する方法としてHandlerを使用して、UIにアクセスする方法があります。
Handlerインスタンスを生成し、postメソッドで実行する処理を与えてやることで
UIスレッドでHandlerに蓄積された処理を実行することが出来ます。
while (thread != null) { Canvas canv = holder.lockCanvas(); // mHandler.post(new Runnable() { @Override public void run() { showTime.setText("roop"); } }); canv.drawColor(Color.BLUE); Paint a = new Paint(); a.setColor(Color.BLACK); a.setTextSize(20); canv.drawText("test", 10, 20, a); holder.unlockCanvasAndPost(canv); try { Thread.sleep(100); Thread.yield(); } catch (Exception e) { } }