SurfaceViewのholder.lockCanvas()でNullPointerException

SurfaceViewのholder.lockCanvas()でNullPointerExceptionが発生するという問題があった。理由のわからないバグで結構はまった。

原因:SurfaceViewのsurfaceCreated()が呼ばれる前に、holder.lockCanvas()が呼ばれるとNullPointerExceptionが発生するということだった。

対策:

  1. surfaceCreated()が実行されたかどうかのフラグを持つ。
  2. surfaceCreated()が実行されれば「true」。surfaceDestroyed()が実行されれば「false」。
  3. ループの中だったら、holder.lockCanvas()の実行前にフラグをチェックする。「false」ならcontinue。
  4. 念のため、CanvasののNULLチェックも実行。「false」ならcontinue。

try {
Thread.sleep(100 / level);
} catch (Exception e) {}

ループの実行間隔短い時におきやすい。アニメーションなどを実装するときには注意した方がいいかもしれない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です