2011-05-02 18 views
8

Aquí está el código:¿Por qué el servicio Android se bloquea con NullPointerException?

public class BillingService extends Service implements ServiceConnection { 
... 
    @Override 
    public void onStart(Intent intent, int startId) { 
     handleCommand(intent, startId); // line 361 
    } 

    /** 
    * The {@link BillingReceiver} sends messages to this service using intents. 
    * Each intent has an action and some extra arguments specific to that action. 
    * @param intent the intent containing one of the supported actions 
    * @param startId an identifier for the invocation instance of this service 
    */ 
    public void handleCommand(Intent intent, int startId) { 
     String action = intent.getAction(); 
     if (Debug.Yes) { 
      Log.i(TAG, "handleCommand() action: " + action); 
     } 
     if (Consts.ACTION_CONFIRM_NOTIFICATION.equals(action)) { 
      String[] notifyIds = intent.getStringArrayExtra(Consts.NOTIFICATION_ID); 
      confirmNotifications(startId, notifyIds); 
     } else if (Consts.ACTION_GET_PURCHASE_INFORMATION.equals(action)) { 
      String notifyId = intent.getStringExtra(Consts.NOTIFICATION_ID); 
      getPurchaseInformation(startId, new String[] { notifyId }); 
     } else if (Consts.ACTION_PURCHASE_STATE_CHANGED.equals(action)) { 
      String signedData = intent.getStringExtra(Consts.INAPP_SIGNED_DATA); 
      String signature = intent.getStringExtra(Consts.INAPP_SIGNATURE); 
      purchaseStateChanged(startId, signedData, signature); 
     } else if (Consts.ACTION_RESPONSE_CODE.equals(action)) { 
      long requestId = intent.getLongExtra(Consts.INAPP_REQUEST_ID, -1); 
      int responseCodeIndex = intent.getIntExtra(Consts.INAPP_RESPONSE_CODE, 
        ResponseCode.RESULT_ERROR.ordinal()); 
      ResponseCode responseCode = ResponseCode.valueOf(responseCodeIndex); 
      checkResponseCode(requestId, responseCode); 
     } 
    } 

Aquí es el LogCat:

java.lang.RuntimeException: Unable to start service [email protected] 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:876) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at tv.kinobaza.billing.BillingService.onStart(BillingService.java:361) 
at android.app.Service.onStartCommand(Service.java:420) 
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053) 
... 10 more 
+0

Qué código hace la línea 361 a punto en su BillingService.java? –

Respuesta

11

Creo que la causa más probable sería porque habría intentnull. De acuerdo con la documentación para onStartCommand:

intent

El Intent suministrada a startService(Intent), como se indica. Esto puede ser null si el servicio está siendo reiniciado después de su proceso se ha ido, y había regresado previamente nada, excepto START_STICKY_COMPATIBILITY

+0

¿Qué debo hacer para evitar esto? –

+0

@Jean Hominal, ¿qué debo hacer si 'intento == null'? –

+1

@LA_: ¿Ha comprobado (en un depurador, por ejemplo), que la intención era nula? Después de eso, si encuentra que el intento * dado es * nulo, entonces ... es su aplicación. Vuelva a leer el fragmento de documentación que cité: explica en qué caso podría ser nulo. Después de eso, usted y los que están desarrollando su aplicación son los únicos que pueden decidir qué hacer. (Por ejemplo, puede evitar tener un Intento nulo por completo, o puede decidir no hacer nada). –

4
@Override 
public void onStart(Intent intent, int startId) { 
    handleCommand(intent, startId); 
} 

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

Cómo evitar la doble llamada a la tarea handleCommand (intent, startId); como se llamarán onStart() y onStartCommand? ¿es un buen diseño? @Novato –

Cuestiones relacionadas