7

で一部のアクティビティを起動しているときに戻るボタンをすばやく押そうとするとGLSurfaceView、でeglCreateWindowSurface失敗しjava.lang.IllegalArgumentExceptionます。

次のエラーが発生しました。

10-08 18:05:36.490: E/GLSurfaceView(3440): eglCreateWindowSurface
10-08 18:05:36.490: E/GLSurfaceView(3440): java.lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface
10-08 18:05:36.490: E/GLSurfaceView(3440): at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface(Native Method)
10-08 18:05:36.490: E/GLSurfaceView(3440): at com.google.android.gles_jni.EGLImpl.eglCreateWindowSurface(EGLImpl.java:90)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$DefaultWindowSurfaceFactory.createWindowSurface(GLSurfaceView.java:798)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$EglHelper.createSurface(GLSurfaceView.java:1065)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1433)
10-08 18:05:36.490: E/GLSurfaceView(3440): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)

SurfaceHolder.Callback.surfaceCreatedこれらのアクティビティは、前後にGL操作を呼び出しませんでしたSurfaceHolder.Callback.surfaceDestroyed

他の誰かがこれに遭遇しましたか、そして解決策は何ですか?

よろしくお願いします。

4

2 に答える 2

11

複数のアクティビティを切り替えると、ウィンドウの表面がすぐに壊れてしまいます。

GLSurfaceView.guardedRun()の競合状態を回避するためにパッチを適用しましたGLSurfaceView

から:

                if (createEglSurface) {
                    if (LOG_SURFACE) {
                        Log.w("GLThread", "egl createSurface");
                    }
                    gl = (GL10) mEglHelper.createSurface(getHolder());
                    if (gl == null) {
                        // Couldn't create a surface. Quit quietly.
                        break;
                    }
                    sGLThreadManager.checkGLDriver(gl);
                    createEglSurface = false;
                }

に:

                if (createEglSurface) {
                    if (LOG_SURFACE) {
                        Log.w("GLThread", "egl createSurface");
                    }
                    gl = (GL10) mEglHelper.createSurface(getHolder());
                    if (gl == null) {
                        // If we escape, GLThread ends up. Don't escape.
                        continue;
                    }
                    sGLThreadManager.checkGLDriver(gl);
                    createEglSurface = false;
                }

この問題はJellyBeanで修正されたように見えます。

于 2012-10-15T08:02:40.273 に答える
1

同じ問題が発生し、surfaceDestroyedのコールバックを設定し、super.surfaceDestroyedを呼び出すことで修正しました。

glSurfaceView = new GLSurfaceView(context) {
    public void surfaceDestroyed(SurfaceHolder holder) {
        super.surfaceDestroyed(holder);
    }
};
于 2013-08-07T16:54:13.167 に答える