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()
。这可能不是正确的方法,但对我来说是有效的