我创建了一个动态壁纸。
它工作正常,但如果我想要长按屏幕,我会去预览壁纸并在预览中打开我的动态壁纸,之后壁纸会破坏。
我得到例外:java.lang.IllegalStateException: Surface has already been released
。
答案 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()
。这可能不是正确的方法,但它对我有用。