Моя панель прогресса не синхронизируется с моим таймером обратного отсчета

#java #android #android-studio #wear-os

#java #Android #android-studio #wear-os

Вопрос:

Здесь я создал этот метод для запуска моего таймера, а тот, что ниже, обновляет таймер:

  private void startTimer()
{
    mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            mTimeLeftInMillis = millisUntilFinished;
            updateCountDownText();
            progress  ;
            pb.setProgress((int)progress*100/((int)millisUntilFinished/1000));
        }

        @Override
        public void onFinish()
        {
            progress  ;
            pb.setProgress(100);
            //Vibration
            if (Build.VERSION.SDK_INT >= 26)
            {
                ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
                Toast.makeText(MainActivity2.this,"Done",Toast.LENGTH_SHORT).show();
            }
            else
            {
                ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createWaveform(new long[]{150}, new int[]{VibrationEffect.EFFECT_CLICK},-1));
            }
        }
    }.start();
}


 private void updateCountDownText()
{

    //time in minutes and seconds
    int minutes = (int)(mTimeLeftInMillis/1000)/60;
    int seconds = (int)(mTimeLeftInMillis/1000)%60;
    //formating the above to appear as String
    String timeLeftFormatted = String.format("d:d",minutes,seconds);
    timer.setText(timeLeftFormatted);
}
  

«pb» — это имя моей панели прогресса. Он продолжает заканчиваться раньше, чем обратный отсчет на 2 минуты, и я не знаю, как их синхронизировать. Также по завершении вибрация по какой-то причине не запускается, хотя это было раньше. «прогресс» инициализируется как ноль в качестве глобальной переменной.

Ответ №1:

Вот решение:

 long millisInFuture;

private void startTimer() {
    millisInFuture = mTimeLeftInMillis;
    mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {
            mTimeLeftInMillis = millisUntilFinished;
            updateCountDownText();
            long millisPassed = millisInFuture - mTimeLeftInMillis;
            progress = (int) (millisPassed * 100 / millisInFuture);
            pb.setProgress(progress);
        }

        @Override
        public void onFinish() {
            pb.setProgress(100);
            Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                VibrationEffect effect =
                        VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE);
                vibrator.vibrate(effect);
                Toast.makeText(MainActivity2.this, "Done", Toast.LENGTH_SHORT).show();
            } else {
                vibrator.vibrate(150);
            }
        }
    }.start();
}
  

Комментарии:

1. Я не знаю, работает это или нет, потому что таймер перестал считать индикатор выполнения, хотя он работает

2. @MohamedElKayal Если вы не знаете, попробуйте запустить этот код и сообщите мне результат.

3. Я запустил его, я имел в виду, что после того, как я это сделал, счетчик не обновил только индикатор выполнения. Я попробую запустить его снова, чтобы посмотреть, не пропустил ли я что-нибудь.

4. «счетчик», который вы упомянули в своем комментарии, — это timer TextView в вашем коде, не так ли?

5. Я думаю, что он работает, просто ожидая его завершения, заранее спасибо, и да, счетчик — это текстовое представление таймера.

Ответ №2:

Но я не вижу, когда вы инициализируете свою панель прогресса. Если вы установите pb.max (или setMax в Java) = 100 и при каждом нажатии вызываете метод :

 private changePb(long millisUntilFinished){
    pb.progress = (millisUntilFinished / millisStartValue) * 100
}
  

Где millisStartValue было первым значением, которое вы ввели в new CountDownTimer(mTimeLeftInMillis

И в onFinish вам не нужно вводить новое значение для progressbar.

Комментарии:

1. должен ли я инициализировать панель прогресса как ноль? Это то, что вы имеете в виду?

2. да, просто проверяю, установлен ли индикатор выполнения на максимальное значение = 100 (может быть в вашем макете)

3. max установлен на 100, а прогресс равен нулю, так чего же мне здесь не хватает?