2016年2月14日日曜日

java.lang.IllegalStateException: Surface has already been released.でハマる


一ヵ月以上ブログの更新が滞ってしまいました。

その原因は、タイトルに挙げた例外とそれに関連する以下の不具合対策に時間をとられていたためです。


アプリの描画はSurfaceViewを使っているのですが、アプリ動作中に「アプリ履歴ボタン」を連打すると、以下の9行目で、

 java.lang.IllegalStateException: Surface has already been released.

という例外が発生することがあります。
問題は、よくサンプルコードとして目にする以下の個所です。

 1: SurfaceHolder holder = getSurfaceHolder();
 2: Canvas c = null;
 3: try {
 4:     c = holder.lockCanvas();
 5:     if (c != null) {
 6:         :
 7:     }
 8: } finally {
 9:     if (c != null) holder.unlockCanvasAndPost(c);
10: }

9行目で例外が発生しているといことは、lockCanvasはできたけど、unlockCanvasAndPostしようとしたら、すでにSurfaceはreleasedだ、ということで、だれかがlockしていても、releaseされてしまうことがあるということですね。

さらにしつこく連打し続けていると、「戻る」ボタンで終了しなくなってしまう等の不具合が発生したりします。

ということで対策方法をいろいろ探っているのですが、後者の不具合は自作アプリ以外でも発生することがあるので、もしかしたらOSにも問題があるのかなぁと思うようになってきました。

ということで、対策方法の検討もしつつ、ゲームアプリ第三弾の開発も再開しています。

0 件のコメント:

コメントを投稿