2012-10-12 29 views
6

Podczas próby naciśnięcia przycisku Wstecz szybko podczas uruchamiania niektórych działań z GLSurfaceView, eglCreateWindowSurface kończy się niepowodzeniem z java.lang.IllegalArgumentException.eglCreateWindowSurface kończy się niepowodzeniem z java.lang.IllegalArgumentException

mam następujące błędy:

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) 

Te działania nie wywołują operacje GL przed SurfaceHolder.Callback.surfaceCreated lub po SurfaceHolder.Callback.surfaceDestroyed.

Czy ktoś inny ma do tego dostęp i jakie jest rozwiązanie?

Dzięki za jakiekolwiek zaliczki.

Odpowiedz

11

Przełączanie między wieloma czynnościami Szybko rozdarta powierzchnia okna w dół.

I połatany GLSurfaceView.guardedRun() aby uniknąć sytuacji wyścigu o GLSurfaceView

od:

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

do:

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

To mi wygląda ten problem był fixed in JellyBean.

+0

Dobry chwyt, dzięki! Skończyłem z powrotem całą klasę z Jelly Bean, z powodu braku prostego sposobu na łatanie jednej linii. – usethe4ce

+0

@ usethe4ce, Dzięki. Powodzenia. – Dalinaum

+1

Jak można załatać tę jedną linię? Mam ten sam problem. Czy możesz podać mi jakieś wskazówki. Dziękuję Ci bardzo. – AmyWuGo

1

miałem ten sam problem i naprawić go poprzez ustawienie zwrotnego dla surfaceDestroyed i nazywając super.surfaceDestroyed.

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

Mój problem to nie ten sam przypadek. Zobacz także moją odpowiedź. Dziękujemy i tak, @codeNinja. – Dalinaum

Powiązane problemy