10

我已经在我的应用程序中实施了应用程序计费 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 方法中处理它(这是记录这个错误的地方)。任何指针?

4

4 回答 4

34

您可以替换您提到的行:

if (mContext != null) mContext.unbindService(mServiceConn);

通过这条线

if (mContext != null && mService != null) mContext.unbindService(mServiceConn);

这应该可以解决问题

于 2013-05-11T21:04:51.030 回答
16

我检查了示例项目的最新版本,直到今天我的建议是目前不要使用IabHelper. 它有很大的缺陷。

给你一个想法:

1.)IabHelper启动新线程的异步方法。如果IabHelper.dispose()在线程运行时调用,您总是会遇到各种您甚至无法处理的异常。

2.) 如果与计费服务的连接中断,他们将其设置为null。但除此之外,他们从不检查是否mServicenull在访问方法之前。NullPointerException所以在这种情况下它总是会崩溃。

public void onServiceDisconnected(ComponentName name) {
                logDebug("Billing service disconnected.");
                mService = null;

而这只是冰山一角。说真的,我不明白有人如何将其发布为参考代码。

于 2013-08-11T15:51:44.647 回答
6

我只是在android模拟器上遇到了同样的问题。Billing 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() 中添加它。对我来说很好。

于 2013-04-26T01:32:52.583 回答
0

IabHelper班级以正常的方式工作。

你需要做的是:当你调用startSetup助手时,你需要传递一个回调IabHelper.OnIabSetupFinishedListener,它会告诉你启动设置的结果。如果回调失败,则与 google play 服务的服务连接未建立。您应该IabHelper根据在IabHelper.OnIabSetupFinishedListener. 您当然可以保留一个boolean字段以了解状态。

sam提供的答案实际上是一个技巧(用他自己的话来说)。助手类不应该抛出异常,以便这些类的用户可以在这种情况下实现某些任务。

当然,try/catch如果您不想详细介绍,这是最好的方法(每当由于异常而出现任何问题时,首先想到的肯定是将其放在一个try/catch块中)。

于 2017-04-18T07:05:41.470 回答