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

问题描述 投票:0回答:1

我有一个使用In App Billing v3框架的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的新版本仍然与同一个callstack崩溃。

这是因为IllegalStateException根本无法捕获,还是什么?这里发生了什么?

java android exception google-play in-app-billing
1个回答
2
投票

如果你仔细看看你的调用堆栈,你会发现它不包括launchPurchaseFlow()try块只能从正确的代码中捕获异常,并且因为你的异常不会发生在任何launchPurchaseFlow()调用中,所以它不会发生在你的try中。

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

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

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

强制性提及:IabHelper显然不再受谷歌支持;你应该使用billing client library代替。您发布的链接不再引用您正在使用的库。

© www.soinside.com 2019 - 2024. All rights reserved.