TimerTask не останавливается после нажатия кнопки останова - PullRequest
0 голосов
/ 04 сентября 2018

Итак, я нажимаю кнопку «Пуск» и каждую секунду меняю текст метки с подсчетом времени:

new CountDownTimer(30000, 500) {

    public void onTick(long millisUntilFinished) {

        if (zaciatokgotten) {

            T2 = new Timer();
            tt2 = new TimerTask() {

                public void run() {
                    if(stopclicked == true) {
                        this.cancel();
                    }
                    handler.post(new Runnable() {

                        public void run() {
                            hasStartedtt2 = true;
                            calendar = Calendar.getInstance();
                            simpledate = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
                            do_casu = simpledate.format(calendar.getTime());

                            zaciatok_hour = zaciatok.substring(11, 13);
                            zaciatok_minute = zaciatok.substring(14, 16);
                            koniec_hour = do_casu.substring(11, 13);
                            koniec_minute = do_casu.substring(14, 16);

                            zaciatok_sekundy = zaciatok.substring(17, 19);
                            koniec_sekundy = do_casu.substring(17, 19);


                            final_hour = ((Integer.parseInt(koniec_hour) - Integer.parseInt(zaciatok_hour)) );
                            final_minute = Integer.parseInt(koniec_minute) - Integer.parseInt(zaciatok_minute);
                            final_seconds = Integer.parseInt(koniec_sekundy) - Integer.parseInt(zaciatok_sekundy) - 1;


                            if (final_seconds < 0) {
                                final_seconds = final_seconds + 60;
                                final_minute = final_minute - 1;
                            }

                            if (final_minute < 0) {
                                final_hour = final_hour - 1;
                                final_minute = final_minute + 60;
                            }
                            if (final_hour < 0) {
                                final_hour = 0;
                            }
                            if (final_minute < 0) {
                                final_minute = 0;
                            }

                            if (final_hour == 0) {
                                if (final_minute == 0) {
                                    txtProgress.setText(final_seconds + " s");
                                } else {
                                    txtProgress.setText(final_minute + " m " + final_seconds + " s");
                                }
                            } else {
                                txtProgress.setText(final_hour + " h " + final_minute + " m " + final_seconds + " s");
                            }
                        }
                    });
                }
            };

            T2.schedule(tt2, 1000, 1000);

            if(once ==0) {
                new Thread(new Runnable() {

                    @Override
                    public void run() {

                        while (pStatus <= 100) {

                            handler.post(new Runnable() {

                                @Override
                                public void run() {
                                    progressBar.setProgress(pStatus);
                                }
                            });
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        pStatus++;
                        if (pStatus == 100) {
                            pStatus = 0;
                        }
                    }
                }
            }).start();

            once++;
            this.cancel();
        }
    }}

    public void onFinish() {
    }
}.start();

После того, как я нажму кнопку остановки, progressBar прекращает вращаться, что правильно, но время продолжает увеличиваться, что я делаю не так? Обратите внимание, что эта проблема отсутствует на телефонах, которые я использовал для тестирования, но присутствует на планшетных устройствах, может, они по-разному обрабатывают потоки?

Код для остановки таймера здесь:

stopclicked = true
if(hasStartedtt2 == true) {
    tt2.cancel();
    //  handler.removeCallbacksAndMessages(null);
}
if (T2 != null) {
    T2.cancel();
    T2.purge();
}
pStatus = 101;

EDIT1 : Я только что заметил, что он остановлен, но только через 20 - 25 секунд после нажатия Стоп, что вызывает задержку?

1 Ответ

0 голосов
/ 09 сентября 2018

Причина, по которой время не останавливается (или останавливается "только через 20 - 25 секунд после нажатия кнопки« Стоп »* ) - это новые экземпляры T2 = new Timer() и tt2 = new TimerTask(), которые вы создаете на каждом CountDownTimer х onTick(). Старые экземпляры Timer и TimerTask продолжают находиться в куче Java , выполняя свою работу до момента сбора мусора. Вы можете заметить, что изменения времени неровные.

Более того, вы, похоже, усложняете реализацию задачи . Вам может не понадобиться ни Timer, ни TimerTask. В следующем примере, который останавливает время, используются только CountDownTimer без Timer и TimerTask. Я немного упростил код для краткости.

private CountDownTimer timer;
private TextView txtProgress;
private Button stopButton;
...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    txtProgress = findViewById(R.id.tv);

    timer = new CountDownTimer(30000, 500) {

        public void onTick(long millisUntilFinished) {
                    handler.post(() -> {
                        txtProgress.setText("any text");
                    });
        }

        public void onFinish() { }

    }.start();

    findViewById(R.id.stopButton).setOnClickListener(v -> timer.cancel());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...