2017-02-13 2 views
0

У меня есть связанный класс обслуживания Timer. В нем я хочу инициировать новый CountDownTimer, который обновляет уведомление.Вызов getSystemService(); в конструкторе CountDownTimer дает NPE

Если я пытаюсь переместить объявления для Intent, PendingIntentNotificationManager и вне тела onTick() метод, исключение будет происходить. Он отлично работает, если они объявлены и созданы в рамках метода onTick(). Может кто-нибудь помочь мне понять, почему это так и как я могу обойти это? Создание этих объектов при каждом тике работает, но кажется пустой тратой ресурсов.

private CountDownTimer newDownTimer() { 
    return new CountDownTimer(millisInFuture, countDownInterval) { 

     NotificationManager mNotificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     Intent notificationIntent = new Intent(getApplicationContext(), com.kush.app.stayput.MainActivity.class); 
     PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     public void onTick(long millisUntilFinished) { 
      //Do something in every tick 
      if (isPaused || isCanceled) { 
       //If user requested to pause or cancel the count down timer 
       cancel(); 
      } else { 
       tView.setText("TEXT"); 
       //Put count down timer remaining time in a variable 
       timeRemaining = millisUntilFinished; 

       //Update notification 
       NotificationCompat.Builder mNotifyBuilder = new NotificationCompat.Builder(MainActivity.getContext()) 
         .setContentTitle(getText(R.string.notification_title)) 
         .setContentIntent(pendingIntent) 
         .setContentText("TEXT") 
         .setSmallIcon(R.drawable.ic_stat_name); 

       mNotificationManager.notify(NOTIFICATION_ID, mNotifyBuilder.build()); 
      } 
     } 

     public void onFinish() { 
      //Do something when count down finished 
      timer = newUpTimer(); 
     } 
    }.start(); 
} 

FATAL EXCEPTION: main 
    Process: com.example.kush.com.kush.app.stayput, PID: 16993 
    java.lang.RuntimeException: Unable to instantiate service com.kush.app.stayput.countdown.Timer: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 
     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2862) 
     at android.app.ActivityThread.-wrap4(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 
     at android.content.ContextWrapper.getSystemService(ContextWrapper.java:627) 
     at com.kush.app.stayput.countdown.Timer$1.<init>(Timer.java:156) 
     at com.kush.app.stayput.countdown.Timer.newDownTimer(Timer.java:153) 
     at com.kush.app.stayput.countdown.Timer.reset(Timer.java:147) 
     at com.kush.app.stayput.countdown.Timer.<init>(Timer.java:85) 
     at java.lang.Class.newInstance(Native Method) 
     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2859) 
     at android.app.ActivityThread.-wrap4(ActivityThread.java)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:148)  
     at android.app.ActivityThread.main(ActivityThread.java:5417)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
+0

Это похоже на ошибку lifecylce. Контекст еще не существует. Возможно ли, что вы создаете CountDownTimer в constuctor? Или где-нибудь еще до вызова Activty.onCreate()? – muetzenflo

+0

Существует только одна активность, MainActivity.class. Он существует, поскольку он является тем же самым контекстом, из которого запускается служба. Также нет кода в возвращаемом CountDownTimer; вызов, который в любом случае устанавливает контекст. – KUSH42

+0

попробуйте использовать: 'this.getSystemService' – rafsanahmad007

ответ

0

getSystemService является метод на android.content.Context класса, ваша деятельность/услуги наследуется. CountDownTimer однако не наследует этот класс.

Возможно, вам придется передать контекст вашей функции newDownTimer и убедиться, что вы вызываете ее только после создания Activity/Service.

+1

ОС Android взаимодействует с классом службы перед вызовом функции onCreate(); метод. Это вызывает NPE при попытке выполнить системный вызов, потому что контекст еще не существует. Поскольку я вызывал метод (косвенно) в конструкторе службы, это было затронуто этим. Я исправил свою проблему, переместив метод из конструктора в метод onStartCommand() класса сервиса. – KUSH42

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