2012-10-12 176 views
6

Al intentar presionar el botón Atrás rápidamente durante el inicio de algunas actividades con GLSurfaceView, eglCreateWindowSurface falla con java.lang.IllegalArgumentException.eglCreateWindowSurface falla con java.lang.IllegalArgumentException

Me dieron los siguientes errores:

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) 

Estas actividades no invocan operaciones GL antes o después SurfaceHolder.Callback.surfaceCreatedSurfaceHolder.Callback.surfaceDestroyed.

¿Alguien más ha topado con esto y cuál es la solución?

Gracias por cualquier avance.

Respuesta

11

Alternar entre actividades múltiples rápidamente rasgó la superficie de la ventana hacia abajo.

remendé GLSurfaceView.guardedRun() para evitar la condición de carrera de GLSurfaceView

de:

   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; 
       } 

a:

   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; 
       } 

Parece que me gusta este problema era fixed in JellyBean.

+0

¡Buena captura, gracias! Terminé respaldando a toda la clase de Jelly Bean, por la falta de una forma simple de parchar la línea. – usethe4ce

+0

@ usethe4ce, gracias. Buena suerte. – Dalinaum

+1

¿Cómo podría parchear esa línea? Tengo el mismo problema. ¿Podría darme algunas pistas? Muchas gracias. – AmyWuGo

1

Tuve el mismo problema y lo solucioné configurando una devolución de llamada para surfaceDestroyed y llamando a super.surfaceDestroyed.

glSurfaceView = new GLSurfaceView(context) { 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     super.surfaceDestroyed(holder); 
    } 
}; 
+0

Mi problema no era el mismo caso. Ver también mi respuesta. Gracias de todos modos, @codeNinja. – Dalinaum

Cuestiones relacionadas