2010年6月28日月曜日

[Android]SurfaceViewと終了処理

前の記事で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でループ脱出
  です。
  他の方の処理を参考にさせて頂きました。

0 件のコメント:

コメントを投稿