Wednesday, January 05, 2011

Android/ SurfaceView内のThreadから描画するときはHandler不要

兼ねてよりの夢であった子供用プログラミング環境をつくろう!と、
Androidプログラミングをこの正月に本格的に始めました。
Androidプログラミングのほとんどは、ウィンドウ(Activity)の制御からスレッド制御までJavaで記述します。

今日は、Androidプログラミングでの私の間違いIを紹介します。

開始から一週間ですが、一日数回はつまずいております。
Androidならではだと思われる作法があったためです。
最たるものとして下記があるでしょう。
Viewを制御できるのはシングルスレッド

この制約から解き放たれマルチスレッドからView制御をしたい場合は
Handlerというキューを作る。そこにView制御をキューイングしておく。

を守らねばなりません。
これは、いくつかのブログを参照して得た情報でした。
そこでこんなコードになっていました。
  1. Thread th = new Thread() {  
  2.  public void run() {  
  3.    mHandler.post(new Runnable() {  
  4.     public void run() {  
  5.      Canvas canvas = getHolder().lockCanvas();  
  6.      if (canvas != null) {  
  7.       onDraw(canvas);  
  8.       getHolder().unlockCanvasAndPost(canvas);  
  9.      }  
  10.     }  
  11.    });  
  12.  }  
  13. };  



minghaiさんのブログは参考にさせていただいてますが、そこの記述では
http://goo.gl/vXLg8 通常のViewではHandlerを用いて画面更新を依頼することになるのですが、SurfaceViewでは自分で用意したThreadの中でCanvasを取得して画面領域をロックして、描画を終わったら一気に更新ということが可能です。

ということでした。

【間違い1】SurfaceViewではHandlerはいらない

【間違い訂正後】
ということで下記のようになります。
  1. Thread th = new Thread() {  
  2.  public void run() {  
  3.      Canvas canvas = getHolder().lockCanvas();  
  4.      if (canvas != null) {  
  5.       onDraw(canvas);  
  6.       getHolder().unlockCanvasAndPost(canvas);  
  7.      }  
  8.  }  
  9. };  

No comments:

Post a Comment