Google Play 游戏服务中的 IllegalStateException 没有意义
Posted
技术标签:
【中文标题】Google Play 游戏服务中的 IllegalStateException 没有意义【英文标题】:IllegalStateException in Google Play Game Service doesn't make sense 【发布时间】:2013-06-09 23:41:11 【问题描述】:我在 Play Market 中有一款游戏,我收到了消息和堆栈跟踪。
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)
奇怪的是消息说我应该调用 connect() 并等待 onConnected()。但正如您在堆栈跟踪中看到的那样,调用来自 onConnected()。所以我确定 Google Play 服务已连接。为什么我仍然会收到 IllegalStateException?我没有道理。
【问题讨论】:
没有代码,很难dis,同意你的观点;) 你可能是对的。我将检查哪些代码可以在这里分享。 【参考方案1】:在某些情况下,即使您正确使用 API,android.gms.internal 也会引发 IllegalStateException。例如。下面的跟踪记录了所有客户端的连接,并且在处理 google 对我们的代码的successSignIn() 回调时,我们得到了该异常。 (SwGameHelper 是我们复制的 google 的 GameHelper 代码)
请注意,gms.internal 堆栈跟踪似乎包含一些名为“signOut”的方法。所以这可能是谷歌代码的一个错误,但我猜这是一个竞争条件,连接后连接立即丢失。我不得不处理其他连接服务上的类似比赛。如果这是一场竞赛,谷歌可能只需要更好地记录他们的方法可以抛出此异常,即使您在调用它们时已连接。
我正在考虑解决这个问题的方法。如果我找到好的解决方法,我会更新。
这是我们安装的客户最常见的崩溃错误之一,因此并不罕见。
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)
【讨论】:
我发帖已经 3 个月了(哇)。这仍然经常发生。我相信这是谷歌播放服务库代码的一个错误。我们大约 1% 的安装存在错误,即在成功登录和连接后立即访问游戏服务并抛出未连接。在那个短暂的(通常是 200 毫秒)延迟中,实际连接中断太频繁了。我们已经更新到最新的 google play services 库,没有变化。我们的解决方法是捕获异常并默默地放弃。如果 Google 有人感兴趣,我们可以提供大量日志等提示提示 :)【参考方案2】:我看到了与我开发应用程序时类似的痕迹 - 就像你一样,我最初认为一切都很好。但是,如果您更仔细地查看 GameHelper 代码,我想您会发现您没有连接任何客户端,因此 IllegalStateException 实际上是准确的。
这是我成功连接的痕迹:
06-16 16:33:00.562: D/ian_(3181): onStart: 连接客户端。
06-16 16:33:00.902:D/ian_(3181):连接 GamesClient。
06-16 16:33:03.282: D/ian_(3181): onConnected: 已连接!客户=1
06-16 16:33:03.292:D/ian_(3181):所有客户端现已连接。登录成功。
06-16 16:33:03.292:D/ian_(3181):所有请求的客户端都已连接。登录成功!
06-16 16:33:03.292: D/ian_(3181): MultiTab1 onSignInSucceeded
希望这会有所帮助。祝你好运!
【讨论】:
感谢您的回答。我会检查logcat。我唯一的问题是堆栈跟踪是从现场安装中返回的。我自己从未复制过。以上是关于Google Play 游戏服务中的 IllegalStateException 没有意义的主要内容,如果未能解决你的问题,请参考以下文章
Google Play 游戏服务中的多人游戏 API 将不再可用。如何迁移到 Firebase?