Retrofit2 Callback läuft nicht im Main-Thread mit libgdx

  • Antworten:3
Denis
  • Forum-Beiträge: 2

10.02.2017, 08:23:02 via Website

Hallo,

der Thread-Titel beschreibt das Problem eigentlich bereits. Mein Retrofit2 2.1.0 Callback in Verbindung mit okhttp 3.6.0 und libgdx läuft definitiv nicht im richtigen Thread, obwohl dies der Fall sein sollte, dafür ist der Callback ja gedacht. Synchronous läuft das Ganze wunderbar, was aber nicht das Ziel sein kann.

In Verbindung mit libgdx und den OpenGL Funktionen führt dies zwangsläufig zu einem Problem, die App wird instabil oder stürzt ab. Das Problem zu umgehen und den Code auszulagern möchte ich verhindern. Mich würde interessieren was das Thread-Problem verursacht.

                   call.enqueue(new Callback<JsonRegisterResult>() {
                    @Override
                    public void onResponse(Call<JsonRegisterResult> call, Response<JsonRegisterResult> response) {
                        if (!response.isSuccessful()) {
                            Gdx.app.log("Network", "Response failure");
                            return;
                        }

                        JsonRegisterResult result = response.body();

                        if (result.error == 0) {
                            Gdx.app.log("Network", "Success! Going in-game...");
                        } else {
                            Gdx.app.log("Network", "Failed! Server code: " + result.error);
                        }
                    }

                    @Override
                    public void onFailure(Call<JsonRegisterResult> call, Throwable t) {
                        Gdx.app.log("Network", "Failed! Exception thrown");
                    }
                });
            }
        }

Der Code selbst befindet sich in einem libgdx Button OnClickListener.

mGame.setScreen(new GameScreen(mGame));

innerhalb von onResponse würde mit

E/libEGL: call to OpenGL ES API with no current context (logged once per thread)

sofort zum Absturz führen. Das betrifft aber auch andere Funktionen, einen Dialog einzublenden (z.B. um den Status anzuzeigen) führt zu einem Random-Crash. Das ganze deutet wie ich bereits herausfinden konnte auf ein Thread-Problem hin, aber warum?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.02.2017, 09:13:12 via App

Wie Intitalisierst du deine call Variable mit der du enqueue aufrufst. Dort ist glaube ich der richtige Context notwenig

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Denis
  • Forum-Beiträge: 2

10.02.2017, 11:52:18 via Website

Ebenfalls beim Click Event. Habe das Problem derzeit mit Gdx.app.postRunnable gelöst, was aber nach wie vor nicht mein Ziel ist ;)

Auf der Retrofit Seite heißt es zumindest

On Android, callbacks will be executed on the main thread.

— geändert am 10.02.2017, 11:52:41

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.02.2017, 12:23:14 via App

Jupp ist auch so nur weiß ich nicht in wie weit LibGdx noch Threads etc. im Hintergrund aufbaut. Dafür kenne ich das zu wenig...

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten