7

我在我的应用程序中实现了 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()

mDungeonsPurchaseObserver = new WMBPurchaseObserver(mHandler);

mBillingService = new BillingService();
mBillingService.setContext(BuyModel.this);
ResponseHandler.register(mDungeonsPurchaseObserver);

onClick 购买按钮

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

2 回答 2

12

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

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

我相信这是由空意图引起的。试用!

于 2011-07-20T13:08:20.503 回答
7

我找到了解决此问题的正确方法。那么实际上取决于你如何看待它。如果您不希望您的服务在其进程被终止后重新启动,那么您需要覆盖 onStartCommand 并返回 START_NOT_STICKY。像这样:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
   handleCommand(intent, startId);
   return START_NOT_STICKY;
}

请参阅START_NOT_STICKY。如果您确实希望服务在每次被终止时都重新启动,那么当前选择的答案就是适合您的答案,因为 Android 会在服务被终止后重新启动您的服务。再次,请参阅我提供的链接。

哦,不推荐使用onStart

于 2012-09-19T04:01:10.420 回答