LiveWallpaper:java.lang.IllegalStateException:Surface已经发布

时间:2013-12-18 18:25:24

标签: android

我创建了一个动态壁纸。

它工作正常,但如果我想要长按屏幕,我会去预览壁纸并在预览中打开我的动态壁纸,之后壁纸会破坏。

我得到例外:java.lang.IllegalStateException: Surface has already been released

1 个答案:

答案 0 :(得分:6)

没有你的代码很难说,但我看到了这个异常,但只有当我在完成加载之前离开预览时才会出现。

在我的情况下,它是由于我从AsyncTask方法开始onSurfaceCreated关闭而引起的,但是当它到达我调用surfaceHolder.lockCanvas()表面的时候已被摧毁。

为了解决这个问题,我覆盖了onSurfaceDestroyed方法,并为该类设置了一个名为drawOk的全局变量,如下所示:

    @Override
    public void onSurfaceCreated(SurfaceHolder holder) {
        super.onSurfaceCreated(holder);
        handler.post(reload);
        drawOk = true;
    }

    @Override
    public void onSurfaceDestroyed(SurfaceHolder holder) {
        super.onSurfaceDestroyed(holder);
        handler.removeCallbacks(reload);
        drawOk = false;
    }

    @Override
    public void onVisibilityChanged(boolean visible) {
        super.onVisibilityChanged(visible);
        if(visible) {
            handler.post(reload);
            drawOk = true;
        } else {
            handler.removeCallbacks(reload);
            drawOk = false;
        }
    }

    private void draw() {

        SurfaceHolder surfaceHolder = getSurfaceHolder();
        Canvas canvas = null;

        if(drawOk) {
            canvas = surfaceHolder.lockCanvas();
            if(canvas != null) {
                                // ...
            }
        }
    }   

surfaceHolder.isCreating(),但不是surfaceHolder.isCreated()。这可能不是正确的方法,但它对我有用。