Я хотел бы сделать таймер обратного отсчета сделать непрерывный цикл в 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) {
}
});