Android 使用IabHelper的应用内计费v3 IllegalArgumentException

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

我已经在我的应用程序中实现了应用内计费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方法中处理它(记录此错误的地方)。有什么建议吗?

我只是在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您可以发布差异,以便我们查看您的更改吗?谢谢