【问题标题】:Android Studio - Exception locking surface cannot be caughtAndroid Studio - 无法捕获异常锁定表面
【发布时间】:2015-05-02 08:38:44
【问题描述】:

您好,我在 Android Studio 中制作了一款游戏。有时,当我在模拟器上关闭并重新启动应用程序时,我会在 logcat 中收到以下垃圾邮件:

Exception locking surface
java.lang.IllegalStateException: Surface was already locked

我尝试用 try-catch 块包围canvas = this.surfaceHolder.lockCanvas();,但没有捕获到异常。有没有办法在尝试锁定之前检查画布是否已锁定?

这是我在 MainThread.java 类中的代码

    while (running) {
        startTime = System.nanoTime();
        canvas = null;

    try {
     canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                // update game state
                this.gamePanel.update();
                // draws the canvas on the panel
                this.gamePanel.draw(canvas);
            }

        } catch(Exception e){e.printStackTrace();}finally {
            // in case of an exception the surface is not left in
            // an inconsistent state
            if (canvas != null) {
                try {

                    surfaceHolder.unlockCanvasAndPost(canvas);

                }
                catch(Exception e){e.printStackTrace();}
            }
    }

【问题讨论】:

  • 你找到答案了吗?

标签: java android exception canvas android-studio


【解决方案1】:

您可以识别并使用布尔常量进行检查;

    //create the boolean;
private boolean cLocked = false;


//Locking
 if (!cLocked){
    canvas = this.surfaceHolder.lockCanvas();
    cLocked = true;
}

//Unlocking
if (cLocked) {
    surfaceHolder.unlockCanvasAndPost(canvas);
    cLocked = false;
}

这将防止异常。已锁定时不锁定,反之亦然。

【讨论】:

  • 感谢您的回答。这帮助我解决了类似的问题。我得到了同样的异常。
  • 似乎对我有用。直到我在 Ice Cream Sandwich(SDK 级别 15)上运行我的游戏时,我才得到这个异常。
  • 我必须指出,在 Android Studio 中,关于 cLocked(第二个)的查询表明它始终为真。我不明白这是怎么回事。我将画布锁定在 try/catch 块中,在没有先查看它是否未锁定(使用布尔值)的情况下,我不会锁定它。我有一个 finally 块来解锁画布,但前提是画布不为空且未锁定。这就是它所说的(布尔值)总是正确的。如果捕获到异常并且 cLocked 未设置为 true,则情况并非如此。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2021-10-09
  • 2021-09-17
  • 2021-10-03
  • 2018-02-04
相关资源
最近更新 更多