2012-11-09 2 views
20

Ich bin neu auf OpenGL-ES auf Android, also entschuldige mich für meine noobish Frage. Ich baue dieses Programm für Android v2.2 - SDK # 8. Mein Tablet unterstützt bis zu Android v3.1OpenGLES auf Android - IllegalStateException: setRenderer wurde bereits für diese Instanz aufgerufen

Ich versuche, eine OpenGL-ES-Umgebung für Android einzurichten, indem Sie ein Tutorial auf developer.android.com folgen. Das Programm kompiliert gut, und es sollte einen einfachen blauen Bildschirm auf dem Gerät anzeigen. Als ich jedoch versuchte, es auf meinem Android-Gerät auszuführen, bekam ich den Fehler "IllegalStateException: setRenderer wurde bereits für diese Instanz aufgerufen".

Unten ist mein Code:

public class TA_SpaceActivity extends Activity 
{ 
    private MyGLSurfaceView myGLView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     myGLView = new MyGLSurfaceView(this); //NOTE: this is where the app crashed 
     setContentView(myGLView); 
    } 
} 

class MyGLSurfaceView extends GLSurfaceView 
{ 
    public MyGLSurfaceView(Context context) 
    { 
     super(context); 
     setRenderer (new MyRenderer()); 
     setEGLContextClientVersion(2); 
     setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
    } 
} 

class MyRenderer implements GLSurfaceView.Renderer 
{ 
    public void onSurfaceCreated(GL10 unsued, EGLConfig config) 
    { 
     GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    } 

    public void onDrawFrame(GL10 unused) 
    { 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
    } 

    public void onSurfaceChanged(GL10 unused, int width, int height) 
    { 
     GLES20.glViewport(0, 0, width, height); 
    } 
} 

Zuerst habe ich darauf geachtet, dass die uses-Feature-Tag für OpenGLES in der AndroidManifest.xml Datei enthalten war:

enter image description here

Dann, wenn Ich habe einen Debug-Lauf ausgeführt, die ActivityThread.perfo zeigte eine Fehlermeldung "Quelle nicht gefunden". Also habe ich den Weg dorthin (und ich auch dafür gesorgt, dass die android.jar Datei im Verzeichnis vorhanden ist)

enter image description here

Doch die App abgestürzt rechts in der Zeile „myGLView = new MyGLSurfaceView (dies) ". Als ich das LogCat untersuchte, zeigte es, dass das Programm eine IllegalStateException beim Funktionsaufruf setRenderer() warf.

enter image description here

Also, ich habe 2 Rätsel, die ich im Moment nicht verstehen:

1) Warum es eine „Quelle nicht gefunden“ Fehlermeldung, wenn der Link auf die Quelle werfen hat war klar im Projekt definiert?

2) Warum heißt es "setRenderer() wurde für diese Instanz aufgerufen"? Ich habe es nur einmal in meiner Unterklasse "MyGLSurfaceView" aufgerufen.

Für das erste Rätsel, von dem, was ich gehört habe, wird Eclipse fast immer eine "Source Not Found" -Nachricht für jeden zufälligen Fehler werfen, die Sie machen. Ist es richtig? (Wenn nicht, bitte korrigieren Sie mich).

Wenn dies der Fall ist, dann denke ich, dass die Ursache des Problems etwas mit der Methode setRenderer() in meiner Unterklasse zu tun hat. Nachdem ich den ganzen Tag herumgespielt habe, konnte ich keinen Weg finden, dieses Problem zu beheben. Würde irgendein Körper mir einen Hinweis geben, was ich versuchen kann, dies zu beheben "IllegalStateException: setRenderer() wurde für diese Instanz aufgerufen" Problem?

Vielen Dank im Voraus für Ihre Hilfe.

+0

über "Quelle nicht gefunden". Schauen Sie sich dieses Thema an: http: // stackoverflow.com/questions/14942851/the-source-attachment-does-not-enthalten-die-Quelle-für-die-Datei-layoutinflater-cl –

+0

Über "Quelle nicht gefunden" Fehlermeldung. Schauen Sie sich dieses Thema an: http://stackoverflow.com/questions/14942851/the-source-attachment-does-not-contain-the-source-for-the-file-layoutinflater-cl –

Antwort

41

Ich habe es herausgefunden. Nachdem ich mich in Googles Dokumentationen vertieft hatte, fand ich heraus, dass setEGLContextClientVersion() den Namen checkRenderThreadState(); Diese Funktion löst die ungültige Ausnahme aus "setRenderer() wurde für diese Instanz aufgerufen", wenn der setRenderer() aufgerufen wurde. Anstatt zuerst setRenderer() aufzurufen, habe ich zuerst setGLContextClientVersion() aufgerufen und das Programm kompiliert und ohne Probleme ausgeführt. Ich sehe jetzt den schönen blauen Bildschirm auf meinem Gerät.

Hier ist die Veränderung, die ich gemacht:

public MyGLSurfaceView(Context context) 
{ 
    super(context); 
    setEGLContextClientVersion(2); 
    setRenderer (new MyRenderer()); 
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 
+1

Als Teil der Sortierung der Android App Framework und OpenGL ES 2 Ich habe ein Breakout Spiel mit GLSurfaceView geschrieben. Es geht zwar weit über den Code im Rahmen von docs/demos hinaus, macht aber nichts besonders Verrücktes, so dass es trotzdem als Demo-Code funktionieren sollte. Sie finden es unter http://code.google.com/p/android-breakout/. – fadden

Verwandte Themen