2012-10-12 34 views
6

GLSurfaceView ile bazı Etkinlikler'i başlatırken arka düğmeye hızlıca basmaya çalışırken, java.lang.IllegalArgumentException ile eglCreateWindowSurface başarısız olur.eglCreateWindowSurface, java.lang.IllegalArgumentException ile başarısız olur

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) 

Bu faaliyetler SurfaceHolder.Callback.surfaceCreated önce veya SurfaceHolder.Callback.surfaceDestroyed sonra GL işlemleri çağırmak etmedi:

Ben şu hataları var.

Buna başkası karıştı mı ve çözüm nedir?

Herhangi bir avans için teşekkürler.

cevap

11

Birden çok aktivite arasında geçiş yapmak, pencere yüzeyini hızlıca yırtdı. Bu sorun fixed in JellyBean gibi

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

bana görünüyor:

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

için:

ben den GLSurfaceView

ait yarış durumu önlemek için GLSurfaceView.guardedRun() yamalı.

+0

İyi yakalama, teşekkürler! Bir sınıfa yama çekmek için herhangi bir basit yolun olmaması nedeniyle, tüm sınıfı Jelly Bean'den geri çektim. – usethe4ce

+0

@ usethe4ce, Teşekkürler. İyi şanslar. – Dalinaum

+1

Bu çizgiyi nasıl bağlayabilirsiniz? Aynı problemim var. Bana biraz ipucu verebilir misiniz? Çok teşekkür ederim. – AmyWuGo

1

Aynı sorunu yaşadım ve SurfaceDestroyed için bir geri arama ayarlayarak ve super.surfaceDestroyed öğesini çağırarak düzeltdim.

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

Sorunum aynı durum değildi. Ayrıca cevabımı da gör. Yine de teşekkürler, codeNinja. – Dalinaum

İlgili konular