2011-08-23 19 views
20

Ho un IntentService che sto tentando di avviare. Quando lo faccio, sputa fuori questo:Eccezione puntatore Null avvio IntentService

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 questo e guardato come molte domande StackOverflow simili come sono riuscito a trovare. Tuttavia, ci sono un paio di sottili differenze che non riesco a comprendere. Prima di tutto, non c'è nessuna delle mie classi referenziate nell'eccezione. In secondo luogo, domande simili sono state risolte modificando il contesto o il doppio controllo per assicurarsi che non sia nullo.

Ho codice per controllare che non è il 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) 
     } 
    }); 

} 

mio IntentService è modellato dopo i documenti di Google. Semplicemente un costruttore con un metodo 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... 
} 

Quindi la mia domanda è questa: Dove si trova questa eccezione proviene e c'è qualcosa che posso fare di diverso per evitarlo? Il mio google-fu non mi ha deluso in passato, quindi spero che questa non sia una di quelle risposte dolorosamente ovvie. Inoltre, se ci sono cose che possono essere fatte meglio o semplicemente brutte, le critiche costruttive sono sempre apprezzate.

Ho inserito l'eccezione completa, NewsActivity e NewsService su pastebin nel caso in cui avessi lasciato qualcosa. http://pastebin.com/mR9Sykrq

risposta

50

Se avete intenzione di ignorare onCreate() nella vostra IntentService, quindi assicurarsi di chiamare super.onCreate() in esso. Questo sembra essere probabilmente il tuo problema.

+3

Di solito, se si dimentica questo, ad esempio, un'attività, verrà ricordato quando si blocca, ma apparentemente non qui. –

+0

@Jarett Solo un esempio delle molte meraviglie di Android =] –

+0

Grazie, e funziona per me. – mxi1

8

Non so se è lo stesso problema, ma mi stava usando un intentService anche, e mi stava avendo problemi con l'uso

context = getApplicationContext(); 

o context = getBaseContext(); Non ero imperativi onCreate quindi la soluzione precedente può essere la soluzione per voi, stavo lavorando dentro "onHandleIntent"

otterrei un'eccezione immediato con il primo, e un'eccezione più tardi, quando ho provato ad utilizzare il 2 ° .

Ho finito per rendermi conto che l'Intentservice è esso stesso una sottoclasse di Context, così ho sostituito "questo" ovunque avessi bisogno di un'istanza di "Contesto".

Questo ha risolto il mio problema.

+0

Questo mi aiuta molto. –

+0

Era lo stesso problema del tuo. Molte grazie ... Mi hai risparmiato un sacco di tempo – Yasir

+0

Sto ricevendo un valore nullo per appContext 'Context appContext = getApplicationContext()'. – kAmol