我有一个使用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还是什么?这是怎么回事?
答案 0 :(得分:2)
如果仔细查看调用堆栈,您会发现它不包含launchPurchaseFlow()
。 try
块只能从适当的代码中捕获异常,并且由于您的异常不是在对launchPurchaseFlow()
的任何调用内发生的,因此它不在您的try
内发生。>
launchPurchaseFlow()
使开票状态机开始前进,但是并非每个购买操作都在该功能中发生。换句话说,购买是“异步”完成的。
从堆栈跟踪中可以看到,该异常实际上发生在onServiceConnected()
期间,该异常是从Handler
回调中调用的。到目前为止,launchPurchaseFlow()
已经返回; try
块已过去。为了用try
包围此特定操作,实际上您需要编辑IabHelper
方法,例如onServiceConnected()
。不建议这样做,因为您自己的代码中似乎还有其他错误导致了异常。这是应该解决的问题。
顺便说一句,我找不到flagStartAsync()
抛出IllegalStateException
的v3计费库版本,所以我不确定这是怎么回事。
强制性提及:IabHelper
显然不再受Google支持;您应该改用billing client library。您正在使用的库不再由您发布的链接引用。