2013-06-13 13 views
5

Mam grę na rynku Play i otrzymałem wiadomość i stacktrace z powrotem.IllegalStateException w usłudze Google Play Game Service nie ma sensu.

java.lang.IllegalStateException 
Msg: (Not connected. Call connect() and wait for onConnected() to be called.) 

java.lang.IllegalStateException 
com.google.android.gms.internal.p.n(Unknown Source) 
com.google.android.gms.internal.p.o(Unknown Source) 
com.google.android.gms.internal.e.loadState(Unknown Source) 
com.google.android.gms.appstate.AppStateClient.loadState(Unknown Source) 
com.peerkesoftware.blockcrusher.CloudSave.load(CloudSave.java:31) 
com.peerkesoftware.blockcrusher.CloudSave.setAppStateClient(CloudSave.java:26) 
com.peerkesoftware.blockcrusher.MorburActivity.onSignInSucceeded(MorburActivity.java:475) 
com.peerkesoftware.libgeneric.app.game.GameHelper.succeedSignIn(GameHelper.java:652) 
com.peerkesoftware.libgeneric.app.game.GameHelper.connectNextClient(GameHelper.java:539) 
com.peerkesoftware.libgeneric.app.game.GameHelper.onConnected(GameHelper.java:642) 
com.google.android.gms.internal.p.k(Unknown Source) 
com.google.android.gms.internal.bj.k(Unknown Source) 
com.google.android.gms.internal.p$f.a(Unknown Source) 
com.google.android.gms.internal.p$f.a(Unknown Source) 
com.google.android.gms.internal.p$b.p(Unknown Source) 
com.google.android.gms.internal.p$a.handleMessage(Unknown Source) 
android.os.Handler.dispatchMessage(Handler.java:99) 
android.os.Looper.loop(Looper.java:132) 
android.app.ActivityThread.main(ActivityThread.java:4126) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:491) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
dalvik.system.NativeStart.main(Native Method) 

Dziwne jest to, że komunikat powinien wywołać metodę connect() i czekać na połączenie onConnected(). Ale jak widać na stosie, wywołanie przychodzi z onConnected(). Tak więc wiem na pewno, że usługi Google Play są ze sobą połączone. Dlaczego nadal otrzymuję wyjątek IllegalStateException? Nie ma sensu.

+0

Bez kodu, trudno {dis,} zgodzić się z tobą tam;) – fge

+0

Prawdopodobnie masz rację. Sprawdzę, jaki sens ma tutaj udostępnienie kodu. –

Odpowiedz

1

Podczas pracy nad aplikacją widziałem ślady podobne do tych, na których początkowo zakładałem, że wszystko jest w porządku. Jednakże, jeśli przyjrzysz się bliżej kodowi GameHelper, uważam, że nie łączysz żadnych klientów, a więc IllegalStateException jest w rzeczywistości dokładny.

To właśnie mój ślad udanego połączenia wygląda następująco:

06-16 16: 33: 00.562: D/ian_ (3181): onStart: podłączania klientów.

06-16 16: 33: 00.902: D/ian_ (3181): Łączenie GamesClient.

06-16 16: 33: 03.282: D/ian_ (3181): onConnected: connected! klient = 1

06-16 16: 33: 03.292: D/ian_ (3181): Wszyscy klienci są teraz połączeni. Logowanie się powiodło.

06-16 16: 33: 03.292: D/ian_ (3181): Podłączono wszystkich żądanych klientów. Logowanie się udało!

16/06 16: 33: 03,292: D/ian_ (3181) MultiTab1 onSignInSucceeded

nadzieję, że to pomaga. Powodzenia !

+0

Dzięki za odpowiedź. Sprawdzę logcat. Mam tylko problem, że stacktrace wraca z instalacji w terenie. Nigdy tego nie powtórzyłem. –

3

Są przypadki, w których android.gms.internal rzuca IllegalStateException nawet przy prawidłowym użyciu interfejsu API. Na przykład. Śledzenie poniżej rejestruje, że wszyscy klienci łączą się i to jest podczas obsługi wywołania zwrotnego goSignIn() google do naszego kodu, który otrzymujemy jako wyjątek. (SwGameHelper to nasza kopia kodu GameHelper google)

Należy zauważyć, że śledzenie stosów gms.internal wydaje się zawierać niektóre metody o nazwie "signOut". Może to być błąd związany z kodem google, ale domyślam się, że jest to stan wyścigu, w którym połączenie jest tracone natychmiast po nawiązaniu połączenia. Miałem do czynienia z podobnymi wyścigami w innych połączonych serwisach. Jeśli jest to wyścig, Google może po prostu lepiej udokumentować, że ten wyjątek może zostać rzucony przez ich metody, nawet jeśli jesteś połączony, gdy je wywołasz.

Rozważam obejścia, w których to przechwytywamy. Zaktualizuję, jeśli znajdę dobrą poprawkę.

Jest to jeden z naszych najczęstszych błędów podczas instalacji u klientów, więc nie jest to rzadkością.

onConnected: connected! client=1 com.lootworks.swords.screens.SwGameHelper 
Connecting PlusClient. com.lootworks.swords.screens.SwGameHelper 
onConnected: connected! client=2 com.lootworks.swords.screens.SwGameHelper 
All clients now connected. Sign-in successful. com.lootworks.swords.screens.SwGameHelper 
All requested clients connected. Sign-in succeeded! com.lootworks.swords.screens.SwGameHelper 

java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called. 
    at com.google.android.gms.internal.p.n(Unknown Source) 
    at com.google.android.gms.internal.p.o(Unknown Source) 
    at com.google.android.gms.internal.bj.a(Unknown Source) 
             loadAchievements 
             b 
             a 
             signOut 
             a 
             a 
    at com.google.android.gms.games.GamesClient.loadAchievements(Unknown Source) 
              signOut 
    at com.lootworks.swords.social.SwAchievementManager.loadAndUploadAchievements(SourceFile:441) 
    at com.lootworks.swords.activity.SwMap3D.onSignInSucceeded(SourceFile:3526) 
    at com.lootworks.swords.screens.SwGameHelper.succeedSignIn(SourceFile:639) 
    at com.lootworks.swords.screens.SwGameHelper.connectNextClient(SourceFile:530) 
    at com.lootworks.swords.screens.SwGameHelper.onConnected(SourceFile:629) 
    at com.google.android.gms.internal.p.k(Unknown Source) 
    at com.google.android.gms.internal.bj.k(Unknown Source) 
    at com.google.android.gms.internal.p$f.a(Unknown Source) 
    at com.google.android.gms.internal.p$f.a(Unknown Source) 
    at com.google.android.gms.internal.p$b.p(Unknown Source) 
    at com.google.android.gms.internal.p$a.handleMessage(Unknown Source) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
+1

Od opublikowania upłynęły 3 miesiące (wow). To wciąż dzieje się regularnie. Uważam, że jest to błąd związany z kodem biblioteki usług Google Play. Około 1% naszych instalacji zawiera błąd polegający na tym, że dostęp do usług gier natychmiast po pomyślnym zalogowaniu się i połączeniu rzutów nie jest połączony.Zbyt częste jest bycie rzeczywistymi spadkami połączenia w tym krótkim (zwykle 200 ms) opóźnieniu. Zaktualizowaliśmy system do najnowszej wersji usług Google Play, bez zmian. Nasze obejście polega na wychwyceniu wyjątku i po cichu poddaniu się. Jeśli ktoś w Google jest zainteresowany, możemy dostarczyć wiele logów itp. Podpowiedź :) – mwk