java - 无法从 Google 的 IAB 框架捕获 IllegalStateException

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

我有一个使用 In App Billing 的 Google Play 应用程序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 的新版本仍然会因相同的调用堆栈而崩溃。

这是因为根本无法捕获 IllegalStateException 还是其他原因?这是怎么回事?

最佳答案

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

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

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

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

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

关于java - 无法从 Google 的 IAB 框架捕获 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640031/

相关文章:

java - 我想要一个集中的方式来控制我的按钮

java - 无法在不删除前一个元素的情况下在 Arraylist 中添加 HashMap

android - 自定义 BaseAdapter EditText 单击并在按钮单击中更新数据库

android - BottomNavigationView - 如何取消选中所有 MenuItems 并保持标题显示?

java - 构造函数应抛出 IllegalArgumentException(需要在 this() 之前检查)

java - 为什么 Java 代码的输出低于 "adb",而不是 "abd"?

c++ - 如何在 Visual Studio 2008 C++ 中捕获被零除错误?

java - Spring-boot 安全性不会尊重具有自定义 AuthenticationProvider 的角色

java - 为什么我遇到以下代码 :Exception in thread "main" java. lang.OutOfMemoryError: Java 堆空间错误

android - 如何在 Android 的 SQLite 数据库中存储时间值?