Android InApp购买空指针异常

Android InApp购买空指针异常,android,in-app-billing,Android,In App Billing,我在我的应用程序中实现了inApp购买,但有时它会给我NPE,下面是堆栈跟踪。如果有人感兴趣,我也可以发布代码 java.lang.RuntimeException: Unable to start service com.market.BillingService@48400380 with null: java.lang.NullPointerException at android.app.ActivityThread.handleServiceArgs(ActivityThread.ja

我在我的应用程序中实现了inApp购买,但有时它会给我NPE,下面是堆栈跟踪。如果有人感兴趣,我也可以发布代码

java.lang.RuntimeException: Unable to start service com.market.BillingService@48400380 with null: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3063)
at android.app.ActivityThread.access$3600(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.market.BillingService.handleCommand(BillingService.java:369)
at com.market.BillingService.onStart(BillingService.java:359)
at android.app.Service.onStartCommand(Service.java:420)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
... 10 more
java.lang.NullPointerException
at com.market.BillingService.handleCommand(BillingService.java:369)
at com.market.BillingService.onStart(BillingService.java:359)
at android.app.Service.onStartCommand(Service.java:420)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
at android.app.ActivityThread.access$3600(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
at dalvik.system.NativeStart.main(Native Method)
下面是相关代码

@Override
protected void onStart() {
    super.onStart();
    ResponseHandler.register(mDungeonsPurchaseObserver);
}
@Override
protected void onStop() {
    super.onStop();
    ResponseHandler.unregister(mDungeonsPurchaseObserver);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mBillingService.unbind();
}
在OnCreate()中

一键购买按钮

if (!mBillingService.checkBillingSupported())
{
    showDialog(DIALOG_CANNOT_CONNECT_ID);
}
mBillingService.requestPurchase("android.test.purchased", null);

在您的BillingService.java onStart方法中,像这样保护空意图

 if (null != intent) {
        handleCommand(intent, startId);
 }

我相信这是由无效意图造成的。试试看

我找到了解决这个问题的正确方法。实际上,这取决于你如何看待它。如果不希望在进程终止后重新启动服务,则需要重写onStartCommand并返回START\u NOT\u STICKY。像这样:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
   handleCommand(intent, startId);
   return START_NOT_STICKY;
}
看。如果您确实希望每次终止服务时都重新启动该服务,那么当前选择的答案就是适合您的答案,因为Android将在终止服务后以空意图重新启动您的服务。再次,请参阅我提供的链接


哦,不推荐使用。

我已经实现了你的方法,让我们看看,既然我的应用程序没有每次崩溃,那么它是否会发生10次或更多次中的1次,我相信还有一个地方你需要防范无效意图。你能为崩溃发布logcat吗?我现在不记得了,但我确信我在示例代码中也遇到过这种崩溃,并通过保护null修复了它。崩溃日志将帮助我回忆起它。我已经发布了崩溃日志供参考,看看这是否有助于你回忆起我受够了这个问题,我的解决方案是否仍然崩溃?相关问题:那么什么是计费服务的正确方式?重新启动还是不重新启动?不重新启动是正确的,因为如果使用BillingService的活动不再位于前台,则BillingService无需在后台运行。不过,一旦活动重新启动,您必须考虑重新启动服务(或绑定到服务)。服务器响应不能稍微晚一点,并且在应用程序不在前台时实际到达吗?当然,即使应用程序不在前台,您也会希望账单信息到达?只要不要在活动的onPause()中从服务中解除绑定(),保持对服务的引用处于活动状态,Android就不会执行此过程。但是,请记住取消绑定并删除活动的onDestroy中的所有引用,因为如果操作系统决定删除,应用程序可能会被杀死,在这种情况下,您必须清理引用以获得正确的GC。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
   handleCommand(intent, startId);
   return START_NOT_STICKY;
}