无法从 Google 的 IAB 框架中捕获 IllegalStateException
Can't catch IllegalStateException from Google's IAB framework
我有一个使用 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.onIabSetupFinished (ArmorActivity.java:185)
at com.steenriver.armor.util.IabHelper.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
块只能捕获其中正确代码中的异常,并且由于您的异常不会发生在对 launchPurchaseFlow()
的任何调用中,因此它不会发生在您的 try
.[= 中26=]
launchPurchaseFlow()
导致计费状态机开始推进,但并非每个购买操作都发生在该函数内。也就是说,购买完成"asynchronously".
正如您从堆栈跟踪中看到的那样,异常实际上发生在 onServiceConnected()
期间,这是从 Handler
回调中调用的。 launchPurchaseFlow()
此时其实已经返回; try
块是过去的。为了用 try
包围这个特定的操作,您实际上需要编辑 IabHelper
方法,例如 onServiceConnected()
。并且不推荐这样做,因为您自己的代码中的其他错误似乎可能导致异常。这是应该解决的问题。
顺便说一下,我找不到 flagStartAsync()
抛出 IllegalStateException
的 v3 计费库版本,所以我不确定这是怎么回事。
强制性提及:Google 显然不再支持 IabHelper
;你应该改用 billing client library 。您发布的 link 不再引用您正在使用的库。
我有一个使用 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.onIabSetupFinished (ArmorActivity.java:185)
at com.steenriver.armor.util.IabHelper.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
块只能捕获其中正确代码中的异常,并且由于您的异常不会发生在对 launchPurchaseFlow()
的任何调用中,因此它不会发生在您的 try
.[= 中26=]
launchPurchaseFlow()
导致计费状态机开始推进,但并非每个购买操作都发生在该函数内。也就是说,购买完成"asynchronously".
正如您从堆栈跟踪中看到的那样,异常实际上发生在 onServiceConnected()
期间,这是从 Handler
回调中调用的。 launchPurchaseFlow()
此时其实已经返回; try
块是过去的。为了用 try
包围这个特定的操作,您实际上需要编辑 IabHelper
方法,例如 onServiceConnected()
。并且不推荐这样做,因为您自己的代码中的其他错误似乎可能导致异常。这是应该解决的问题。
顺便说一下,我找不到 flagStartAsync()
抛出 IllegalStateException
的 v3 计费库版本,所以我不确定这是怎么回事。
强制性提及:Google 显然不再支持 IabHelper
;你应该改用 billing client library 。您发布的 link 不再引用您正在使用的库。