Android LiveWallper:java.lang.IllegalStateException:Surface已发布

Android LiveWallper:java.lang.IllegalStateException:Surface已发布,android,Android,我已经创造了一个活的壁纸 它工作得很好,但如果我想在屏幕上长按,我去现场墙纸,打开我的现场墙纸预览,在那之后墙纸会变得一团糟 我得到了一个异常:java.lang.IllegalStateException:Surface已经发布了如果没有您的代码,很难判断,但是我看到了这个异常,但只有在加载完成之前我离开预览时才看到 在我的例子中,这是因为我从onSurfaceCreated方法启动了一个AsyncTask,但是当它到达我调用surfaceHolder.lockCanvas()的点时,表面已经

我已经创造了一个活的壁纸

它工作得很好,但如果我想在屏幕上长按,我去现场墙纸,打开我的现场墙纸预览,在那之后墙纸会变得一团糟


我得到了一个异常:
java.lang.IllegalStateException:Surface已经发布了

如果没有您的代码,很难判断,但是我看到了这个异常,但只有在加载完成之前我离开预览时才看到

在我的例子中,这是因为我从
onSurfaceCreated
方法启动了一个
AsyncTask
,但是当它到达我调用
surfaceHolder.lockCanvas()
的点时,表面已经被破坏了

为了解决这个问题,我重写了
onsurfacedestromed
方法,并为该类设置了一个名为
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()
。这可能不是正确的方法,但对我来说是有效的