我创建了动态壁纸。
它工作正常,但如果我想长按屏幕并转到动态壁纸并在预览中打开我的动态壁纸,之后壁纸就会变得困惑。
我得到异常:java.lang.IllegalStateException: Surface has already been released
。
最佳答案
如果没有您的代码很难判断,但我看到了这个异常,但只有当我在完成加载之前离开预览时才看到。
在我的例子中,这是因为我从 onSurfaceCreated
方法启动了一个 AsyncTask
,但是当它到达我调用 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()
。这可能不是正确的方法,但它对我有用。
关于android - 动态壁纸 : java. lang.IllegalStateException: Surface has already been released,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20665636/