Android 使用IabHelper的应用内计费v3 IllegalArgumentException
我已经在我的应用程序中实现了应用内计费v3大约一周了。我使用了大量android的示例代码来简化集成。我经常记录一次崩溃,但似乎无法重现:Android 使用IabHelper的应用内计费v3 IllegalArgumentException,android,in-app-billing,Android,In App Billing,我已经在我的应用程序中实现了应用内计费v3大约一周了。我使用了大量android的示例代码来简化集成。我经常记录一次崩溃,但似乎无法重现: Exception Type: java.lang.RuntimeException Reason: Unable to destroy activity {[package].billing.BillingActivity}: java.lang.IllegalArgumentException: Service not registered: [p
Exception Type: java.lang.RuntimeException
Reason: Unable to destroy activity {[package].billing.BillingActivity}: java.lang.IllegalArgumentException: Service not registered: [package].billing.util.IabHelper$1@40646a70
这条线似乎在中断:
if (mContext != null) mContext.unbindService(mServiceConn);
我在onCreate方法中绑定此服务,并在onDestroy方法中处理它(记录此错误的地方)。有什么建议吗?我只是在android emulator上遇到了同样的问题。计费v3要求至少启动一次Google Play应用程序,由于模拟器缺少Google Play应用程序,因此无法设置帮助程序,也无法在onDestroy()中处理它 我的个人解决方法只是跳过try/catch中的错误:
@Override
protected void onDestroy() {
super.onDestroy();
if (bHelper != null){
try {
bHelper.dispose();
}catch (IllegalArgumentException ex){
ex.printStackTrace();
}finally{}
}
bHelper = null;
}
将此添加到每个处理帮助程序的onDestroy()中。对我来说很好。您可以替换您提到的线路:
if (mContext != null) mContext.unbindService(mServiceConn);
按这条线
if (mContext != null && mService != null) mContext.unbindService(mServiceConn);
这应该可以做到我查看了最新版本的,到今天为止,我的建议是当前不要使用
IabHelper
。它有很大的缺陷
给你一个想法:
1.IabHelper
的异步方法启动一个新线程。如果在线程运行时调用IabHelper.dispose()
,您将始终得到各种异常,甚至无法处理
2.)如果与计费服务的连接中断,他们会将其设置为null
。但除此之外,在访问方法之前,他们从不检查mService
是否为null
。因此,在这种情况下,它总是会因NullPointerException
而崩溃
public void onServiceDisconnected(ComponentName name) {
logDebug("Billing service disconnected.");
mService = null;
这只是冰山的一角。说真的,我不明白怎么会有人把它作为参考代码发布。IABHeloper类以正常方式工作 您需要做的是: 为帮助程序调用
startSetup
时,需要传递回调IabHelper.OnIabSetupFinishedListener
,该回调将告诉您启动安装程序的结果。如果回调失败,则与google play服务的服务连接未建立。
根据在IabHelper.OnIabSetupFinishedListener
中接收到的结果,您应该处理以后对IabHelper
的调用。您当然可以保留一个boolean
字段来了解状态
提供的答案实际上是一个骗局(用他自己的话说)。helper类不应该抛出异常,以便这些类的用户可以在此类场景中实现某些任务
当然,
try/catch
是最好的方法,如果您不想详细说明(无论什么时候由于异常而中断,首先想到的肯定是将其放在try/catch
块中)。这是一个丑陋的解决方案和编程风格(捕获异常而不做任何处理)。您应该找到问题的原因,而不是隐藏其影响。原因是服务未连接,因此mService=null(正如Sam注意到的)和mSetupDone=false。您可以检查它们中的任何一个,以避免对未绑定的服务执行解除绑定。即使这看起来很难看,但效果也不错。我的崩溃是由正在重新启动的活动引起的-a.finish();星触觉(a);-事实上,服务正常关闭所需的时间是主要问题。我认为延迟这个调用可以很容易地处理这个问题:bindService(serviceentent,mServiceConn,Context.BIND\u AUTO\u CREATE);几秒钟后。这是我的情况,我同意。IabHelper在处理并发异步调用时有很多错误。例如,它使用非同步标志来指示已在运行的操作。我使用单线程执行器,一次执行一个异步操作。这也适用于dispose方法。仍然不完美,但线程安全。@Joerg您可以发布差异,以便我们查看您的更改吗?谢谢