2012-10-12 3 views
6

Quando si tenta di premere rapidamente il pulsante Indietro durante l'avvio di alcune attività con GLSurfaceView, eglCreateWindowSurface non riesce con java.lang.IllegalArgumentException.eglCreateWindowSurface non riesce con java.lang.IllegalArgumentException

ho ottenuto i seguenti errori:

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) 

Queste attività non ha invocato operazioni GL, prima o dopo SurfaceHolder.Callback.surfaceCreatedSurfaceHolder.Callback.surfaceDestroyed.

Qualcun altro ha incontrato questo, e qual è la soluzione?

Grazie per qualsiasi anticipo.

risposta

11

Passaggio da attività multiple a superfici strappate rapidamente verso il basso.

ho patchato GLSurfaceView.guardedRun() per evitare race condition di GLSurfaceView

da:

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

Sembra a me come questo problema è stato fixed in JellyBean.

+0

Buona cattura, grazie! Ho terminato il backporting dell'intera classe da Jelly Bean, per la mancanza di un modo semplice di applicare patch su una riga. – usethe4ce

+0

@ usethe4ce, grazie. In bocca al lupo. – Dalinaum

+1

Come si può riparare quella riga? Ho avuto lo stesso problema. Potresti per favore darmi qualche suggerimento. Grazie mille. – AmyWuGo

1

Ho avuto lo stesso problema e ha riparato impostando un callback per surfaceDestroyed e chiamando super.surfaceDestroyed.

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

Il mio problema non è lo stesso. Vedi anche la mia risposta. Grazie comunque, @codeNinja. – Dalinaum