代码之家  ›  专栏  ›  技术社区  ›  Bram

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

  •  0
  • Bram  · 技术社区  · 6 年前

    我有一个使用 In App Billing V3框架。

    谷歌游戏 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的新版本仍然使用相同的调用堆栈崩溃。

    这是因为根本无法抓住非法状态例外,还是什么原因?这是怎么回事?

    1 回复  |  直到 6 年前
        1
  •  2
  •   greeble31    6 年前

    如果仔细查看您的调用堆栈,您会发现它不包括 launchPurchaseFlow() . try 块只能捕获正确包含在其中的代码中的异常,并且由于您的异常不会发生在对 启动采购流() ,这不是发生在你的 尝试 .

    启动采购流() 使计费状态机开始前进,但并非每个购买操作都在该功能内发生。换句话说,购买是“异步”完成的。

    从堆栈跟踪中可以看到,异常实际上发生在 onServiceConnected() ,从 Handler 回调。 启动采购流() 已经实际返回到该点;该 尝试 块在过去。为了用一个 尝试 ,您实际上需要编辑 IabHelper 方法,如 OnServiceConnected()。 . 不建议这样做,因为您自己的代码中可能有其他错误导致了异常。这是应该解决的问题。

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

    强制性说明: 懒汉 显然不再被谷歌支持;你应该使用 billing client library 相反。您使用的库不再被您发布的链接引用。