Исключение нулевого указателя при запуске IntentService - PullRequest
21 голосов
/ 23 августа 2011

У меня есть IntentService, который я пытаюсь запустить.Когда я это делаю, он выплевывает это:

java.lang.RuntimeException: Unable to start service com.pec.testapp.service.NewsService@406bd940 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

Я гуглил это и посмотрел на столько похожих вопросов StackOverflow, сколько смог найти.Тем не менее, есть несколько тонких различий, которые я не могу обернуть вокруг себя.Прежде всего, ни один из моих классов не упоминается в исключении.Во-вторых, подобные вопросы были исправлены путем изменения контекста или двойной проверки, чтобы убедиться, что он не равен нулю.

У меня есть код, чтобы проверить, что это не так:

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)
        }
    });

}

My IntentServiceсмоделировано после документов Google.Просто конструктор с методом 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...
}

Итак, мой вопрос таков: Откуда происходит это исключение и есть ли что-то, что я могу сделать по-другому, чтобы его избежать? Мой google-Фу не подвела меня в прошлом, так что, надеюсь, это не один из тех болезненно очевидных ответов.Кроме того, если есть вещи, которые можно сделать лучше или просто безобразно, конструктивная критика всегда приветствуется.

Я помещаю полное исключение, NewsActivity и NewsService в pastebin на случай, если я что-то пропущу.http://pastebin.com/mR9Sykrq

Ответы [ 2 ]

51 голосов
/ 23 августа 2011

Если вы собираетесь переопределить onCreate() в вашем IntentService, то обязательно наберите super.onCreate() в нем. Похоже, это ваша проблема.

8 голосов
/ 02 декабря 2011

Не уверен, что это та же проблема, но я также использовал intentService, и у меня возникли проблемы с использованием

context = getApplicationContext();

или context = getBaseContext (); Я не переопределил OnCreate, поэтому предыдущее решение может быть решением для вас, Я работал внутри "onHandleIntent"

Я получу немедленное исключение с первым и исключение позже, когда попробую использовать второе.

Я понял, что Intentservice сам по себе является подклассом Context, поэтому я заменил «this» там, где мне был нужен экземпляр «Context».

Это решило мою проблему.

...