2012-11-09 13 views
20

Jestem nowicjuszem OpenGL-ES na Androida, więc przepraszam za moje noobish pytanie. Buduję ten program dla Androida v2.2 - SDK # 8. Mój tablet obsługuje system Android w wersji 3.1OpenGLES na Androida - IllegalStateException: setRenderer został już wywołany dla tej instancji

Próbuję skonfigurować środowisko OpenGL-ES dla Androida, postępując zgodnie z samouczkiem na stronie developer.android.com. Program został skompilowany dobrze i miał wyświetlać prosty niebieski ekran na urządzeniu. Jednak gdy próbowałem uruchomić go na moim urządzeniu z systemem Android, otrzymałem komunikat o błędzie "IllegalStateException: setRenderer został już wywołany dla tego wystąpienia".

Poniżej jest mój kod:

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

pierwsze, zrobiłem pewien, że znacznik uses-funkcja dla OpenGLES został zawarty w pliku AndroidManifest.xml:

enter image description here

Potem, kiedy Zrobiłem uruchomienie debugowania, ActivityThread.perfo pokazał komunikat o błędzie "Source Not Found". Więc dodałem ścieżkę do niego (i ja również upewnić się, że plik android.jar istnieje w katalogu)

enter image description here

Mimo to aplikacja rozbił się tuż przy linii „myGLView = new MyGLSurfaceView (ta) ". Kiedy przejrzałem LogCat, okazało się, że program rzucił wyjątek IllegalStateException na wywołanie funkcji setRenderer().

enter image description here

Tak, mam 2 puzzle, które nie rozumiem w tej chwili:

1) Dlaczego to rzucić "Źródło not found" komunikat o błędzie, gdy link do źródła było jasno określone w projekcie?

2) Dlaczego napis "setRenderer() został wywołany dla tego wystąpienia"? Nazwałem go tylko raz w mojej podklasie "MyGLSurfaceView".

W przypadku pierwszej układanki, z tego, co słyszałem, Eclipse prawie zawsze wyśle ​​wiadomość "Źródło nie znalezione", gdy za każdy przypadkowy błąd popełnisz błąd. Czy to jest poprawne? (jeśli nie, popraw mnie).

Jeśli tak jest, to myślę, że podstawowa przyczyna problemu ma coś wspólnego z metodą setRenderer() w mojej podklasie. Po całym dniu kręcenia się nie mogłem znaleźć sposobu na rozwiązanie tego problemu. Czy jakiekolwiek ciało dałoby mi wskazówkę, co mogę spróbować naprawić ten "IllegalStateException: setRenderer() został wywołany dla tego wystąpienia" problem?

Z góry dziękujemy za pomoc.

+0

O "Źródło not found". Zobacz ten temat: http: // stackoverflow.com/questions/14942851/the-source-attachment-does-not-contain-the-source-for-the-file-layoutinflater-cl –

+0

Informacje o błędzie "Nie znaleziono źródła". Zobacz ten temat: http://stackoverflow.com/questions/14942851/the-source-attachment-does-not-contain-the-source-for-the-file-layoutinflater-cl –

Odpowiedz

41

Wymyśliłem to. Po wkopaniu się w dokumentacje Google dowiedziałem się, że setEGLContextClientVersion() zwane jest checkRenderThreadState(); ta funkcja wyrzuca niedozwolony wyjątek "wywołanie setRenderer() dla tej instancji", jeśli wywołano funkcję setRenderer(). Zamiast więc wywoływać najpierw metodę setRenderer(), najpierw wywołałem metodę setEGLContextClientVersion(), a program skompilował i działał bez problemu. Widzę teraz piękny niebieski ekran wyświetlany na moim urządzeniu.

Oto zmiany, które zrobiłem:

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

W ramach sortowania aplikacji na Androida framework i OpenGL ES 2 Napisałem grę Breakout używając GLSurfaceView. To idzie daleko poza kod w dokumentach/demach, ale nie robi nic szczególnie szalonego, więc powinno nadal działać jako kod demo. Można go znaleźć pod adresem http://code.google.com/p/android-breakout/. – fadden

Powiązane problemy