2011-08-23 16 views
20

Tengo un servicio de intención que intento iniciar. Cuando lo haga, se escupe esto:Excepción de puntero nulo que inicia el servicio de intención

java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=com.pec.testapp/.service.NewsService }: java.lang.NullPointerException 
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2173) 
    ... (omitted for brevity) 
Caused by: java.lang.NullPointerException 
    at android.app.IntentService.onStart(IntentService.java:110) 
    at android.app.IntentService.onStartCommand(IntentService.java:118) 
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2160) 
    ... 10 more 

Googled esto y mirado tantas preguntas StackOverflow similares que pude encontrar. Sin embargo, hay un par de diferencias sutiles que no puedo entender. Primero que nada, no hay ninguna de mis clases referenciadas en la excepción. En segundo lugar, se han solucionado preguntas similares cambiando el contexto o haciendo doble comprobación para asegurarse de que no sea nulo.

que tienen código para comprobar que no es el caso:

public Context context; 
@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    context = getApplicationContext(); 

    if(context == null) 
     Log.d("PECAPP","Context is null"); 

    setContentView(R.layout.news_layout); 

    ...Omit button code... 
    button.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View view){ 
      Intent i = new Intent(context, NewsService.class); // also tried NewsActivity.this 
      if(i != null) // I know that this should never happen but I'm at a loss... 
       startService(i); // I've also tried this with context.startService(i) 
     } 
    }); 

} 

Mi IntentService sigue el modelo de los documentos de Google. Simplemente un constructor con un método onHandleIntent.

public NewsService() { 
    super("NewsService"); 
} 

...omit onCreate() and onDestroy() since they haven't been implemented yet... 

@Override 
protected void onHandleIntent(Intent intent) throws IllegalArgumentException { 
    Log.d("PECAPP","Got here..."); // I never actually got here... 
    if(intent == null) Log.d("PECAPP","INTENT IS NULL"); 
    ...omit rest of code... 
} 

Así que mi pregunta es la siguiente: ¿Dónde está esta excepción viene y ¿hay algo que pueda hacer diferente para evitarlo? Mi google-fu no me ha fallado en el pasado, así que espero que esta no sea una de esas respuestas dolorosamente obvias. Además, si hay cosas que se pueden hacer mejor o simplemente son feas, siempre se agradece la crítica constructiva.

Pongo la excepción completa, NewsActivity y NewsService en pastebin en caso de que haya dejado algo. http://pastebin.com/mR9Sykrq

Respuesta

50

Si usted va a anular onCreate() en su IntentService, a continuación, asegúrese de llamar super.onCreate() en ella. Ese parece ser tu problema.

+3

Por lo general, si olvida esto en, por ejemplo, una Actividad, le recordará cuando se cuelgue, pero aparentemente no está aquí. –

+0

@Jarett Solo un ejemplo de las muchas maravillas de Android =] –

+0

Gracias, y me funciona. – mxi1

8

No estoy seguro si es el mismo problema, pero yo estaba usando un intentService también, y yo estaba teniendo problemas para usar

context = getApplicationContext(); 

o contexto = getBaseContext(); no estaba preponderantes con onCreate lo que la solución anterior puede ser la solución para usted, yo estaba trabajando en el interior "onHandleIntent"

me gustaría conseguir una excepción inmediata con la primera, y una excepción después, cuando he intentado usar el segundo .

acabé dando cuenta de que la Intentservice es en sí misma una subclase de contexto, así que sustituido "este" donde quiera que necesitaba una instancia de "contexto".

Esto resolvió mi problema.

+0

Esto me ayuda mucho. –

+0

Estaba enfrentando el mismo problema que el suyo. Muchas gracias ... Me has ahorrado mucho tiempo – Yasir

+0

Obtengo valor nulo para appContext 'Context appContext = getApplicationContext()'. – kAmol

Cuestiones relacionadas