Я хотел бы сделать таймер обратного отсчета сделать непрерывный цикл в Android - нужно мнение о том, как это сделать

Есть ли способ непрерывного цикла таймера обратного отсчета? У меня есть базовый таймер: 60 секунд, затем обновление текстового поля, и оно работает, но я хочу добавить функциональность: при обратном отсчете автоматический перезапуск до тех пор, пока пользователь не отменит его? Может быть, запустить его через поток? Не уверен, как справиться с этим. Вот что у меня есть, и снова этот код работает, но я могу только остановить и запустить таймер обратного отсчета, но не делать непрерывный цикл:

cdt = new CountDownTimer(60000,1000) {
    public void onTick(long millisUntilFinished) { 
        tvTimer.setText("remaining : " + millisUntilFinished/1000 + " secs");
    }
     public void onFinish() { 
       tvTimer.setText("");
       bell.start(); 
     }
 };

 /***************On Click/Touch Listeners*******************/
 btnNext.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
        tvTimer.setText("");
        btnStart.setText("Start Timer");
        SetImageView2(myDbHelper); 
        cdt.cancel(); 

       }
    });

    btnStart.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
        if (!TimerTicking){ 
          cdt.start();
          btnStart.setText("Stop Timer");
        }
        else { 
            tvTimer.setText("");
            cdt.cancel();
            btnStart.setText("Start Timer");

        }
       }
    });

3 ответа

Решение

Один из самых простых способов зациклить CountDownTimer - это вызвать start() в onFinished(),

public void onFinish() {
    ...
    start();  // Start this timer over
}

(Убедитесь, что вы отменили свой CountDownTimer в onPause() когда вы делаете это иначе, таймер может просочиться и продолжать стрелять в фоновом режиме... Упс.)

Однако у CountDownTimers есть фундаментальные недостатки (на мой взгляд): он часто пропускает последний вызов onTick() и он получает несколько миллисекунд каждый раз onTick() называется...:(Я переписал CountDownTimer в предыдущем вопросе, чтобы быть более точным и вызывать каждый тик.

Первое значение в конструкторе CountDownTimer(), общее время выполнения, является длинным и может содержать значение, приближающееся к 300 миллионам лет. Это должно быть достаточно долго для большинства мобильных приложений.:-)

Так что просто позвоните с cdt = new CountDownTimer(Long.MAX_VALUE, 1000) за одну секунду цикл, который будет работать непрерывно.

Это мой код, надеюсь, это поможет.

private int currentPage = 0;
private void setupAutoPager()
{
    final Handler handler = new Handler();

    final Runnable update = new Runnable() {
        public void run()
        {

            viewPager.setCurrentItem(currentPage, true);
            if(currentPage == arrayList_img.size())
            {
                currentPage = 0;
            }
            else
            {
                ++currentPage ;
            }
        }
    };


    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            handler.post(update);
        }
    }, 0, 2500);
}

а затем в вашем onCreate():

 setupAutoPager();
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            currentPage=position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
Другие вопросы по тегам