前の記事でSurfaceViewの描画処理が軽いと書きましたが、実際にはViewよりもメモリもCPUパワーも食うけどフレームレートが高くなるよ、が正しいところでしょうか。
携帯アプリだと描画処理にパワーとメモリを食って、キーイベントの割り込みが遅れるなんてこともあったので(かなり前の端末ですが)、描画用スレッドのループにはそれなりのsleepを入れた方が良さそうです。
さて、View#OnDraw(Canvas)で実装していた描画処理をSurfaceViewに変更しました。
【引っかかった点】
・コンストラクタで描画スレッド作ってstart()させちゃダメ
⇒surfaceCreated(SurfaceHolder)でやるのが正解。
(そうやってたつもりでしたが、書く場所間違えてました・・・うっかり?)
・Xperiaの□ボタン押しても、描画スレッドのログが止まらない〜
⇒マルチスレッドですものね。
ゾンビ恐ろしや。
SurfaceViewをセットしたActivityのOnPause()をオーバーライドして、描画スレッドのループを抜けてスレッド終了させるようにしました。
こんな感じのメソッドをSurfaceView継承クラスに追加して、OnPause()から呼んでいます。
このメソッドの後ろにActivity#finish()を記述しています。
public void endLoop() {
synchronized (MainLoop) {
// ループを抜ける
loopflg = false;
}
try{
// スレッドの終了を待つ
MainLoop.join();
} catch( InterruptedException ex ){
Thread.currentThread().interrupt();
}
}
MainLoop:描画スレッド
loopflg:trueだとループ、falseでループ脱出
です。
他の方の処理を参考にさせて頂きました。