SurfaceViewのholder.lockCanvas()でNullPointerExceptionが発生するという問題があった。理由のわからないバグで結構はまった。
原因:SurfaceViewのsurfaceCreated()が呼ばれる前に、holder.lockCanvas()が呼ばれるとNullPointerExceptionが発生するということだった。
対策:
- surfaceCreated()が実行されたかどうかのフラグを持つ。
- surfaceCreated()が実行されれば「true」。surfaceDestroyed()が実行されれば「false」。
- ループの中だったら、holder.lockCanvas()の実行前にフラグをチェックする。「false」ならcontinue。
- 念のため、CanvasののNULLチェックも実行。「false」ならcontinue。
try {
Thread.sleep(100 / level);
} catch (Exception e) {}
ループの実行間隔短い時におきやすい。アニメーションなどを実装するときには注意した方がいいかもしれない。