为了账号安全,请及时绑定邮箱和手机立即绑定

无法从 Google 的 IAB 框架中捕获 IllegalStateException

无法从 Google 的 IAB 框架中捕获 IllegalStateException

SMILET 2022-06-15 17:25:48
我有一个使用In App Billing v3 框架的 Google Play 应用。Google Play开发者控制台报告频繁崩溃java.lang.IllegalStateException事实上,我的大部分崩溃都是这种非法状态异常。我使用 IAB 框架中的示例代码来处理我的应用内购买。调用堆栈:  at com.steenriver.armor.util.IabHelper.flagStartAsync (IabHelper.java:824)  at com.steenriver.armor.util.IabHelper.queryInventoryAsync (IabHelper.java:616)  at com.steenriver.armor.util.IabHelper.queryInventoryAsync (IabHelper.java:644)  at com.steenriver.armor.ArmorActivity$1.onIabSetupFinished (ArmorActivity.java:185)  at com.steenriver.armor.util.IabHelper$1.onServiceConnected (IabHelper.java:262)  at android.app.LoadedApk$ServiceDispatcher.doConnected (LoadedApk.java:1625)  at android.app.LoadedApk$ServiceDispatcher$RunConnection.run (LoadedApk.java:1653)  at android.os.Handler.handleCallback (Handler.java:836)  at android.os.Handler.dispatchMessage (Handler.java:103)  at android.os.Looper.loop (Looper.java:232)  at android.app.ActivityThread.main (ActivityThread.java:6802)  at java.lang.reflect.Method.invoke (Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1103)  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:964)为了摆脱崩溃,我决定在代码中添加异常处理,如下所示:try{    mHelper.launchPurchaseFlow( this, sku, RC_REQUEST, mPurchaseFinishedListener, payload );} catch( IllegalStateException e ){    Log.e( TAG, e.toString() );     // Illegal State: maybe purchase is already in progress?    enableBuyButton();              // Enable buy button so customer can try again.}令我惊讶的是,添加了 try/catch 的新版本仍然会因相同的调用堆栈而崩溃。这是因为 IllegalStateException 根本无法被捕获,还是什么?这里发生了什么?
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

如果您仔细查看您的调用堆栈,您会发现它不包含launchPurchaseFlow()try块只能从正确位于其中的代码中捕获异常,并且由于您的异常没有发生在对 . 的任何调用中launchPurchaseFlow(),因此它不会发生在您的try.

launchPurchaseFlow()导致计费状态机开始推进,但并非每个购买操作都发生在该函数内。换句话说,购买是“异步”完成的。

从堆栈跟踪中可以看出,异常实际上发生在 期间onServiceConnected(),它是从Handler回调中调用的。launchPurchaseFlow()此时实际上已经返回;该try块是过去的。为了用 包围这个特定的操作try,您实际上需要编辑一个IabHelper方法,例如onServiceConnected(). 不建议这样做,因为您自己的代码中的一些其他错误似乎导致了异常。这是应该修复的。

顺便说一句,我找不到flagStartAsync()抛出的 v3 计费库版本IllegalStateException,所以我不确定这是怎么回事。

必须提及:IabHelper显然不再受 Google 支持;您应该改用计费客户端库。您发布的链接不再引用您正在使用的库。


查看完整回答
反对 回复 2022-06-15
  • 1 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号