2012-10-12 14 views
6

Wenn versucht wird, die Zurück-Taste während des Starts einiger Aktivitäten mit GLSurfaceView schnell zu drücken, schlägt eglCreateWindowSurface mit java.lang.IllegalArgumentException fehl.eglCreateWindowSurface schlägt mit java.lang.IllegalArgumentException fehl

bekam ich folgende Fehler:

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) 

Diese Aktivitäten aufrufen nicht GL geführten Aktivitäten vor SurfaceHolder.Callback.surfaceCreated oder nach SurfaceHolder.Callback.surfaceDestroyed.

Hat jemand anderes in diese und was ist die Lösung?

Danke für jeden Fortschritt.

Antwort

11

Wechseln zwischen mehreren Aktivitäten schnell Fensterfläche abgerissen.

ich gepatcht GLSurfaceView.guardedRun() Race-Bedingung von GLSurfaceView

von zu vermeiden:

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

zu:

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

Es scheint mir, wie dieses Problem fixed in JellyBean war.

+0

Guter Fang, danke! Am Ende habe ich die gesamte Klasse von Jelly Bean zurückportiert, weil es keine einfache Möglichkeit gab, die eine Zeile zu patchen. – usethe4ce

+0

@ usethe4ce, Danke. Viel Glück. – Dalinaum

+1

Wie könnten Sie diese eine Zeile patchen? Ich habe dasselbe Problem. Könnten Sie mir bitte ein paar Hinweise geben? Vielen Dank. – AmyWuGo

1

Ich hatte das gleiche Problem und reparierte es, indem ich einen Callback für das SurfaceDestroyed setzte und Super.surfaceDestroyed nannte.

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

Mein Problem war nicht der gleiche Fall. Siehe auch meine Antwort. Danke trotzdem, @codeNinja. – Dalinaum