android - 动态壁纸 : java. lang.IllegalStateException: Surface has already been released

标签 android

我创建了动态壁纸。

它工作正常,但如果我想长按屏幕并转到动态壁纸并在预览中打开我的动态壁纸,之后壁纸就会变得困惑。

我得到异常: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/

相关文章:

java - 维护具有性能的排序列表

Android 依赖项 'androidx.localbroadcastmanager:localbroadcastmanager' 具有不同的编译版本 (1.0.0-rc01) Flutter

java - 避免'Layer exceeds max dimensions supported by the GPU in Android

android - Camera2 在一个捕获 session 中拍摄多张图像

android - Android 上的请求和多步响应 ussd

android-widget - Android NumberPicker 如何找到改变的数量?

android - 从最近的应用程序中刷出应用程序后服务代码未运行

android - 以编程方式检测硬件调用/挂断键的存在

java - Appium:任何使用元素的 id 来自动化应用程序的工作

java - Android:应用程序关闭时从后台推送动态通知