Androidプログラミングをこの正月に本格的に始めました。
Androidプログラミングのほとんどは、ウィンドウ(Activity)の制御からスレッド制御までJavaで記述します。
今日は、Androidプログラミングでの私の間違いIを紹介します。
開始から一週間ですが、一日数回はつまずいております。
Androidならではだと思われる作法があったためです。
最たるものとして下記があるでしょう。
Viewを制御できるのはシングルスレッド
この制約から解き放たれマルチスレッドからView制御をしたい場合は
Handlerというキューを作る。そこにView制御をキューイングしておく。
を守らねばなりません。
これは、いくつかのブログを参照して得た情報でした。
そこでこんなコードになっていました。
Thread th = new Thread() {
public void run() {
mHandler.post(new Runnable() {
public void run() {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
onDraw(canvas);
getHolder().unlockCanvasAndPost(canvas);
}
}
});
}
};
minghaiさんのブログは参考にさせていただいてますが、そこの記述では
http://goo.gl/vXLg8 通常のViewではHandlerを用いて画面更新を依頼することになるのですが、SurfaceViewでは自分で用意したThreadの中でCanvasを取得して画面領域をロックして、描画を終わったら一気に更新ということが可能です。
ということでした。
【間違い1】SurfaceViewではHandlerはいらない
【間違い訂正後】
ということで下記のようになります。
Thread th = new Thread() {
public void run() {
Canvas canvas = getHolder().lockCanvas();
if (canvas != null) {
onDraw(canvas);
getHolder().unlockCanvasAndPost(canvas);
}
}
};
No comments:
Post a Comment