Почему метод StopTimer () заставляет приложение вызывать sh при вызове после очистки приложения от последних задач? - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь создать приложение, которое будет прослушивать изменения состояния 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) 

1 Ответ

0 голосов
/ 09 января 2020

Когда вы удаляете приложение из списка недавних задач, процесс ОС, на котором размещено приложение, уничтожается. Ваш таймер теперь мертв.

Вам нужно проверить, работает ли ваш таймер в onReceive(), проверив, countDownTimer равно ли null. Если это так, ваш таймер не работает, и вам больше не нужно его останавливать.

...