Повторение CountDownTimer застрял на 0, прежде чем начать снова - PullRequest
0 голосов
/ 02 октября 2019

У меня есть два CountDownTimers во фрагменте.

CountDownTimer A длиннее, чем CountDownTimer B. Таким образом, когда CountDownTimer B завершается, он устанавливается в цикл. Однако, когда CountDownTimer B достигает 0, он остается на 0 в течение 1 секунды, прежде чем начать снова. Это приводит к тому, что CountDownTimer B отстает от CountDownTimer A, например:

CountDownTimer A: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

CountDownTimerB: 2, 1, 0, 2, 1, 0, 2, 1, 0, 2, 1

2 к 1 - 1-секундный интервал, а от 1 до 0 - 1-секундный интервал, всего2 секундыДля сброса на 2 секунды требуется 1 секунда в течение 0 секунд, то есть фактически это 3-секундный счетчик CountDownTimer. CountDownTimer B должен выполнять цикл 5 раз во время работы CountDownTimer A, но только цикл 3.

Как я могу синхронизировать эти два таймера?

Включает ли это отображение 0 для менее 1 секунды и 2 для отображения менее 1 секунды, так что сумма секунд 0 и 2 отображается = 1 секунда?

10, 9,8, 7, 6, 5, 4, 3, 2, 1, 0

2, 1, 0/2, 1, 0/2, 1, 0/2, 1, 0

Если это невозможно, есть ли способ сбросить CountDownTimer B, когда он достигает 1 секунды?

10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0

2, 1, 2, 1, 2, 1, 2, 1, 2, 1

Я просмотрел форумы и поработал с параметрами каждого CountDownTimer.

OnClickListener для CountDownTimer A

session_set_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                String Sessioninput = session_edit_text.getText().toString();
                if (Sessioninput.length() == 0) {
                    Toast.makeText(getActivity(), "Fill it in", Toast.LENGTH_SHORT).show();
                    return;
                }
                long millisInput = Long.parseLong(Sessioninput) * 1000;
                if (millisInput == 0) {
                    Toast.makeText(getActivity(), "Please enter a positive number", Toast.LENGTH_SHORT).show();
                    return;
                }
                setSessionTime(millisInput);
                session_edit_text.setText("");
                imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
            }
        });

    session_start_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(android.view.View view) {
            if (SessionTimerRunning) {
                pauseSessionTimer();
                resetDROTimer();
            } else {
                startSessionTimer();
                startDROTimer();
            }
        }
    });

    session_reset_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(android.view.View view) {
            if (SessionTimerRunning) {
                resetSessionTimer();
            } else {
                resetSessionTimer();
            }
        }
    });

OnClickListener для CountDownTimer B

    dro_set_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(android.view.View view) {
            String DROinput = dro_edit_text.getText().toString();
            if (DROinput.length() == 0) {
                Toast.makeText(getActivity(), "Fill it in", Toast.LENGTH_SHORT).show();
                return;
            }
            long millisInput = Long.parseLong(DROinput) * 1000;
            if (millisInput == 0) {
                Toast.makeText(getActivity(), "Please enter a positive number", Toast.LENGTH_SHORT).show();
                return;
            }
            setDROTime(millisInput);
            dro_edit_text.setText("");
            imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
        }
    });

    dro_start_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(android.view.View view) {
            if (DROTimerRunning) {
                pauseDROTimer();
            } else {
                startDROTimer();
            }
        }
    });

    dro_reset_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(android.view.View view) {
            if (DROTimerRunning) {
                resetDROTimer();
            } else {
                resetDROTimer();
            }
        }
    });

    return View;
}

CountDownTimer A

public void setSessionTime(long milliseconds) {
        SessionStartTimeInMillis = milliseconds;
        resetSessionTimer();
    }

public void startSessionTimer() {
    SessionEndTime = System.currentTimeMillis() + SessionTimeLeftInMillis;
    sessionTimer = new CountDownTimer(SessionTimeLeftInMillis + 1000, 100) {
        @Override
        public void onTick(long millisUntilFinished) {
            SessionTimeLeftInMillis = millisUntilFinished;
            updateSessionText();
        }

        @Override
        public void onFinish() {
            SessionTimerRunning = false;
            session_start_button.setText("Start");
            session_start_button.setVisibility(android.view.View.INVISIBLE);
            session_reset_button.setVisibility(android.view.View.VISIBLE);
        }
    }.start();

    SessionTimerRunning = true;
    session_start_button.setText("Pause");
}

public void pauseSessionTimer() {
    sessionTimer.cancel();
    droTimer.cancel();
    SessionTimerRunning = false;
    DROTimerRunning = false;
    session_start_button.setText("Start");
    updateSessionText();
}

public void resetSessionTimer() {
    if (SessionTimerRunning) {
        sessionTimer.cancel();
        SessionTimeLeftInMillis = (SessionStartTimeInMillis);
        updateSessionInterface();
        startSessionTimer();
    } else {
        SessionTimeLeftInMillis = (SessionStartTimeInMillis);
        updateSessionText();
        updateSessionInterface();
        session_reset_button.setVisibility(android.view.View.VISIBLE);
        session_start_button.setVisibility(android.view.View.VISIBLE);
    }
}

public void updateSessionText() {
    int minutes = (int) (SessionTimeLeftInMillis/1000/60);
    int seconds = (int) (SessionTimeLeftInMillis/1000)%60;

    String timeLeftFormatted = String.format(Locale.getDefault(),
            timeLeftFormatted = String.format(Locale.getDefault(), "%2d:%02d", minutes, seconds));
    session_text_view.setText(timeLeftFormatted);
}

public void updateSessionInterface() {
    if (SessionTimerRunning) {
        session_edit_text.setVisibility(android.view.View.INVISIBLE);
        session_set_button.setVisibility(android.view.View.INVISIBLE);
        session_reset_button.setVisibility(android.view.View.VISIBLE);
        session_start_button.setText("Pause");
    } else {
        session_edit_text.setVisibility(android.view.View.VISIBLE);
        session_set_button.setVisibility(android.view.View.VISIBLE);
        session_reset_button.setVisibility(android.view.View.VISIBLE);
        session_start_button.setText("Start");
    }
}

CountDownTimer B

public void setDROTime(long milliseconds) {
    DROStartTimeInMillis = milliseconds;
    resetDROTimer();
}

public void startDROTimer() {
    DROEndTime = System.currentTimeMillis() + DROTimeLeftInMillis;
    droTimer = new CountDownTimer(DROTimeLeftInMillis + 1000, 100) {
        @Override
        public void onTick(long millisUntilFinished) {
            DROTimeLeftInMillis = millisUntilFinished;
            updateDROText();

            if (DROTimeLeftInMillis ==1) {
                droTimer.cancel();
                droTimer.start();
            }
        }

        @Override
        public void onFinish() {
            updateDROInterface();
            ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_ALARM, 400);
            toneGenerator.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);
            DROTimerRunning = false;
            droTimer.cancel();
            droTimer.start();
        }
    }.start();

    DROTimerRunning = true;
    dro_start_button.setText("Pause");
}

public void pauseDROTimer() {
    droTimer.cancel();
    DROTimerRunning = false;
    dro_start_button.setText("Start");
    updateDROText();
}

public void resetDROTimer() {
    if (DROTimerRunning) {
        droTimer.cancel();
        DROTimeLeftInMillis = (DROStartTimeInMillis);
        updateDROInterface();
        startDROTimer();
    } else {
        DROTimeLeftInMillis = (DROStartTimeInMillis);
        updateDROText();
        updateDROInterface();
        dro_reset_button.setVisibility(android.view.View.VISIBLE);
        dro_start_button.setVisibility(android.view.View.VISIBLE);
    }
}

public void updateDROText() {
    int seconds = (int) (DROTimeLeftInMillis/1000)%60;

    String timeLeftFormatted = String.format(Locale.getDefault(),
            timeLeftFormatted = String.format(Locale.getDefault(), ":%02d", seconds));
    dro_text_view.setText(timeLeftFormatted);
}

public void updateDROInterface() {
    if (DROTimerRunning) {
        dro_edit_text.setVisibility(android.view.View.INVISIBLE);
        dro_set_button.setVisibility(android.view.View.INVISIBLE);
        dro_reset_button.setVisibility(android.view.View.VISIBLE);
        dro_start_button.setText("Pause");
    } else {
        dro_edit_text.setVisibility(android.view.View.VISIBLE);
        dro_set_button.setVisibility(android.view.View.VISIBLE);
        dro_reset_button.setVisibility(android.view.View.VISIBLE);
        dro_start_button.setText("Start");
    }
}

SharedPreferences

@Override
    public void onStop() {
        super.onStop();

    SharedPreferences preferences = this.getActivity().getSharedPreferences("prefs", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();

    editor.putLong("SessionStartTimeInMillis", SessionStartTimeInMillis);
    editor.putLong("DROStartTimeInMillis", DROStartTimeInMillis);
    editor.putLong("MillisLeft", SessionTimeLeftInMillis);
    editor.putLong("DROMillisLeft", DROTimeLeftInMillis);
    editor.putBoolean("TimerRunning", SessionTimerRunning);
    editor.putBoolean("DROTimerRunning", DROTimerRunning);
    editor.putLong("EndTime", SessionEndTime);
    editor.putLong("DROEndTime", DROEndTime);

    if (sessionTimer !=null); {
        sessionTimer.cancel();
    }

    if (droTimer !=null); {
        droTimer.cancel();
    }
}

@Override
public void onStart() {
    super.onStart();

    SharedPreferences preferences = this.getActivity().getSharedPreferences("prefs", Context.MODE_PRIVATE);

    SessionStartTimeInMillis = preferences.getLong("SessionStartTimeInMillis", 0);
    SessionTimeLeftInMillis = preferences.getLong("MillisLeft", SessionTimeLeftInMillis);
    SessionTimerRunning = preferences.getBoolean("TimerRunning", false);

    DROStartTimeInMillis = preferences.getLong("DROStartTimeInMillis", 0);
    DROTimeLeftInMillis = preferences.getLong("DROMillisLeft", DROTimeLeftInMillis);
    DROTimerRunning = preferences.getBoolean("DROTimerRunning", false);

    updateSessionText();
    updateSessionInterface();
    updateDROText();
    updateDROInterface();

    if (SessionTimerRunning) {
        SessionEndTime = preferences.getLong("EndTime", 0);
        SessionTimeLeftInMillis = SessionEndTime - System.currentTimeMillis();

        if (SessionTimeLeftInMillis <0) {
            SessionTimeLeftInMillis = 0;
            SessionTimerRunning = false;
        } else {
            startSessionTimer();
        }
    }

    if (DROTimerRunning) {
        DROEndTime = preferences.getLong("EndTime", 0);
        DROTimeLeftInMillis = DROEndTime - System.currentTimeMillis();

        if (DROTimeLeftInMillis <0) {
            DROTimeLeftInMillis = 0;
            DROTimerRunning = false;
        } else {
            startDROTimer();
        }
    }
}

}

...