【问题标题】:Can't catch IllegalStateException from Google's IAB framework无法从 Google 的 IAB 框架中捕获 IllegalStateException
【发布时间】:2019-02-11 22:19:50
【问题描述】:

我有一个使用 In App Billing v3 框架的 Google Play 应用。

Google Play Developer Console 报告频繁的崩溃与 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 还是什么?这是怎么回事?

【问题讨论】:

    标签: java android exception google-play in-app-billing


    【解决方案1】:

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

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

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

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

    必须提及:IabHelper 显然不再受 Google 支持;您应该改用billing client library。您发布的链接不再引用您正在使用的库。

    【讨论】:

    • 谢谢!那是正确的。不过,我对不得不进行另一次 IAB 升级感到灰心。到目前为止,我已经经历了许多 IAB 版本。哦,好吧,我就等谷歌对 v3 的弃用警告,然后再升级。
    猜你喜欢
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2018-11-28
    • 2020-04-23
    • 2018-12-11
    • 1970-01-01
    相关资源
    最近更新 更多