2015-09-23 3 views
1

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

09-22 23:44:28.503 4021-4021/? I/art﹕ Late-enabling -Xcheck:jni 
09-22 23:44:28.584 4021-4021/cz.united121.android.revizori D/cz.united121.android.revizori.App﹕ onCreate 
09-22 23:44:28.642 4021-4021/cz.united121.android.revizori D/cz.united121.android.revizori.service.MyUpdatingService﹕ onCreate 
09-22 23:44:28.677 4021-4021/cz.united121.android.revizori D/AndroidRuntime﹕ Shutting down VM 
09-22 23:44:28.679 4021-4021/cz.united121.android.revizori E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: cz.united121.android.revizori, PID: 4021 
    java.lang.RuntimeException: Unable to start service [email protected] with null: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getAction()' on a null object reference 
      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2913) 
      at android.app.ActivityThread.access$2100(ActivityThread.java:148) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5312) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getAction()' on a null object reference 
      at cz.united121.android.revizori.service.MyUpdatingService.onStartCommand(MyUpdatingService.java:94) 
      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2896) 
            at android.app.ActivityThread.access$2100(ActivityThread.java:148) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5312) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 

линия (Log.d (TAG, "onStartCommand" + intent.getAction());), который является исключение см в службе в onStartCommand:

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     Log.d(TAG, "onStartCommand" + intent.getAction()); 
     if (intent.getAction().equals(SERVICE_FORCE)) { 
      LOCATION_APROVAL = true; 
      if (mLastKnownPosition != null) { 
       mTimeAproving.run(); 
      } 
     } else if (intent.getAction().equals(SERVICE_START)) { 
      mUpdatingTimer.scheduleAtFixedRate(mTimeAproving, 0, PERIOD_BETWEEN_UPDATING); 
     } else if (intent.getAction().equals(SERVICE_STOP)) { 
      LOCATION_APROVAL = false; 
      mLastKnownPosition = null; 
      mUpdatingTimer.cancel(); 
      mUpdatingTimer.purge(); 
     } 
     return START_STICKY; 
    } 

Спасибо авансовый.

+0

перед тем, как получить какое-либо действие от намерения, пожалуйста, проверьте намерение null или нет, если не null, то значение getAction() иначе. –

+0

@ Ajit Я пытался это сделать, но он решил решить эту проблему, только покроем ее: D – United121

ответ

2

Ваше приложение и служба были убиты, а затем служба была перезапущена, когда вы использовали флаг START_STICKY. В таком случае intent передан onStartCommand() будет пустым. См. Reasons that the passed Intent would be NULL in onStartCommand

В зависимости от вашей логики вы можете вместо этого возвратить START_REDELIVER_INTENT.

+1

Мне действительно нужно изучить служебный флаг, чтобы понять, что происходит. Ошибка была в другом месте, но спасибо за ссылку. Я прочитаю это. – United121

0

Я решить мою проблему с добавлением stopSelf() в если (intent.getAction(). Equals (SERVICE_STOP)) случай.

+0

Это решает проблему, потому что служба не будет перезапущена, а затем после выхода из приложения (что, похоже, не является вашим намерением, когда ваше приложение отправляет 'SERVICE_STOP'). – headuck

+0

@headuck Итак, я могу решить это даже с помощью START_NOT_STICKY, что означает, что после службы убийства он не начнется снова. Я прав ? – United121

+1

Да, но вы должны подумать о том, что должно делать ваше обслуживание после прерывания до окончания. Если вы используете «START_NOT_STICKY», служба не будет перезапущена, но помните, что приложение и служба могут быть убиты в любое время системой, когда пользователь не активно использует приложение. Если вы хотите, чтобы ваш сервис мог перезапустить и возобновить свою работу, вам может понадобиться «START_STICKY» и реализовать логику возобновления при получении нулевого намерения. Если все в порядке, то вы можете использовать START_REDELIVER_INTENT. – headuck

-1

Ну, если кто-либо использует System.exit (0) по ошибке при закрытии приложения путем перезаписи метода onBackpressed, просто удалите его и просто используйте finish(). Если используется System.exit (0), он убьет службу переднего плана.

+0

Я не понимаю, как это отвечает на вопрос. Вопрос уже более двух лет и имеет принятый ответ. Что ваш ответ добавляет к этому? – melwil

+0

Просто поместите System.exit (0) на onBackpressed и получите ответ. Ни одно из решений не будет работать, если вы поместите System.exit вместо finish(). Служба может быть убита по многим причинам, и одна из причин - System.exit (0). –

Смежные вопросы