我已经在应用账单v3中实现了我的应用程序大约一周了。我使用了很多android的示例代码来简化集成。我经常记录崩溃,我似乎无法重现:
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方法中(这是记录此错误的地方)。有什么指针吗?
答案 0 :(得分:34)
你可以替换你提到的那一行:
if (mContext != null) mContext.unbindService(mServiceConn);
通过这一行
if (mContext != null && mService != null) mContext.unbindService(mServiceConn);
这应该可以解决问题
答案 1 :(得分:16)
我查看了sample project的最新版本,到目前为止,我的建议是不使用IabHelper
。它有很大的缺陷。
给你一个想法:
1。)IabHelper
的异步方法启动一个新线程。如果在线程运行时调用IabHelper.dispose()
,您将始终获得您甚至无法处理的各种异常。
2。)如果与结算服务的连接中断,则会将其设置为null
。但除此之外,他们从不在访问方法之前检查mService
是否为null
。因此,在这种情况下,它始终会与NullPointerException
一起崩溃。
public void onServiceDisconnected(ComponentName name) {
logDebug("Billing service disconnected.");
mService = null;
这只是冰山的一角。说真的,我不明白有人可以将它作为参考代码发布。
答案 2 :(得分:6)
我刚刚在android模拟器上遇到了同样的问题。结算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()中添加它。对我来说很好。
答案 3 :(得分:0)
IabHelper
课程正常工作。
您需要做的是:
当您为帮助者调用startSetup
时,您需要传递一个回调IabHelper.OnIabSetupFinishedListener
,它将告诉您开始设置的结果。如果您在回调中失败,则未建立与Google Play服务的服务连接。
您应该根据IabHelper
中收到的结果处理将来对IabHelper.OnIabSetupFinishedListener
的来电。您肯定可以保留boolean
字段以了解状态。
提供的答案sam实际上是一种技巧(用他自己的话来说)。辅助类不应该抛出异常,以便这些类的用户可以在这种情况下实现某些任务。
当然,try/catch
是最好的方法,如果你不想详细说明(每当因异常而中断时,首先要记住的是将其放在{{1}中阻止)。