У меня есть связанный класс обслуживания Timer
. В нем я хочу инициировать новый CountDownTimer
, который обновляет уведомление.Вызов getSystemService(); в конструкторе CountDownTimer дает NPE
Если я пытаюсь переместить объявления для Intent
, PendingIntent
NotificationManager
и вне тела 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)
Это похоже на ошибку lifecylce. Контекст еще не существует. Возможно ли, что вы создаете CountDownTimer в constuctor? Или где-нибудь еще до вызова Activty.onCreate()? – muetzenflo
Существует только одна активность, MainActivity.class. Он существует, поскольку он является тем же самым контекстом, из которого запускается служба. Также нет кода в возвращаемом CountDownTimer; вызов, который в любом случае устанавливает контекст. – KUSH42
попробуйте использовать: 'this.getSystemService' – rafsanahmad007