Я пытаюсь создать приложение, которое будет прослушивать изменения состояния Wi-Fi и запускать таймер обратного отсчета в службе между изменениями. Если я включаю Wi-Fi, когда активность находится на переднем плане, а затем отключаю Wi-Fi после очистки недавних заданий, приложение вызывает кражу sh. После cra sh он вызывает исключение нулевого указателя в методе, который отвечает за остановку таймера обратного отсчета. Но если я выполню как включение, так и отключение после того, как очистил последние задачи, приложение не выполнит sh.
Это код из метода OnReceive BroadcastReciever, который отвечает за обработку состояния WIFI_STATE_DISABLED:
case WifiManager.WIFI_STATE_DISABLED:
count++;
sharedPreferences.edit().putInt("Count", count).apply();
sharedPreferences.edit().putString(Integer.toString(count), "Disabled at -" + simpleDateFormat.format(new Date())).apply();
if (activityRunning) {
arrayList.add("Disabled at " + simpleDateFormat.format(new Date()));
arrayAdapter.notifyDataSetChanged();
textView.setText("Disabled");
aSwitch.setChecked(false);
}
if (context.getSharedPreferences("com.example.wifilimiter",MODE_PRIVATE).getBoolean("timerRunning", false)) {
stopTimer(context);
sharedPreferences.edit().putLong("millisLeft", millisleft).apply();
}
break;
Это вышеупомянутый метод StopTimer:
public static void stopTimer(Context context) {
if (context.getSharedPreferences("com.example.wifilimiter",MODE_PRIVATE).getBoolean("timerRunning", false)) {
countDownTimer.cancel(); // The app crushes here
context.getSharedPreferences("com.example.wifilimiter",MODE_PRIVATE).edit().putBoolean("timerRunning",false).apply();
Log.d("Timer Running : ","false");
}
Это CountDownTimer:
public static void startTimer(final Context context) {
context.getSharedPreferences("com.example.wifilimiter",MODE_PRIVATE).edit().putBoolean("timerRunning", true).apply();
countDownTimer = new CountDownTimer(millisleft, 1000) {
@Override
public void onTick(long millisUntilFinished) {
millisleft = millisUntilFinished;
String hms = String.format(Locale.getDefault(), "%02d:%02d:%02d", MILLISECONDS.toHours(millisleft),
MILLISECONDS.toMinutes(millisleft) - HOURS.toMinutes(MILLISECONDS.toHours(millisleft)),
MILLISECONDS.toSeconds(millisleft) - MINUTES.toSeconds(MILLISECONDS.toMinutes(millisleft)));
Toast.makeText(context, hms, Toast.LENGTH_SHORT).show();
if (context.getSharedPreferences("com.example.wifilimiter",MODE_PRIVATE).getBoolean("activityStatus",false)) {
Log.d(TAG, "onTick: " + hms);
timer.setText(hms);
}
}
@Override
public void onFinish() {
}
}.start();
}
Это журнал ниже:
Process: com.example.wifilimiter, PID: 5306
java.lang.RuntimeException: Unable to start receiver com.example.wifilimiter.BroadcastReceiver: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2424)
at android.app.ActivityThread.access$1700(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at com.example.wifilimiter.TimerService.stopTimer(TimerService.java:67) //This refers to the countDownTimer.cancel() method
at com.example.wifilimiter.BroadcastReceiver.onReceive(BroadcastReceiver.java:85)//This refers to the StopTimer() method
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2417)
at android.app.ActivityThread.access$1700(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)